为什么"#define A"会干扰"namespace A{}"?

Why does "#define A" interfere with "namespace A{}"?

本文关键字:namespace #define 为什么 干扰      更新时间:2023-10-16

可以编译以下代码:

namespace A{
    int i;
}
namespace B{
    int i;
}
int main(){ return 0; }

但是下面的代码不能编译:

#define A
#define B
namespace A{
    int i;
}
namespace B{
    int i;
}
int main(){ return 0; }

错误信息

错误:int {anonymous}::i'的重新定义

在我定义了AB之后,为什么命名空间的名称变成匿名的?

使用的编译器:gcc-4.9.3

In

#define A
#define B
namespace A{
    int i;
}
namespace B{
    int i;
}

定义AB为0。这意味着你的代码变成了

namespace {
    int i;
}
namespace {
    int i;
}

在预处理器运行之后。由于两个命名空间都变成了匿名命名空间,编译器会正确地提示您正在重新声明i

请记住,当您定义了预处理器将通过源代码执行的操作时,并将该符号的所有出现替换为您定义的符号。

#define A LONG_NAME_I_DO_NOT_WANT_TO_TYPE
#define B ANOTHER_LONG_NAME_THAT_I_ALSO_DO_NOT_WANT_TO_TYPE
namespace A{
    int i;
}
namespace B{
    int i;
}

那么预处理器会将代码更改为

namespace LONG_NAME_I_DO_NOT_WANT_TO_TYPE{
    int i;
}
namespace ANOTHER_LONG_NAME_THAT_I_ALSO_DO_NOT_WANT_TO_TYPE{
    int i;
}

有关预处理器如何工作的更多信息,请参见:GCC - C预处理器