以下代码可以编译:
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; }
错误信息是
error: redefinition of 'int {anonymous}::i'
为什么我定义了A
和B
之后命名空间的名称变成了匿名的?
使用的编译器:gcc-4.9.3。
最佳答案
在
#define A
#define B
namespace A{
int i;
}
namespace B{
int i;
}
您将A
和B
定义为空。这意味着你的代码变成了
namespace {
int i;
}
namespace {
int i;
}
预处理器运行后。由于两个 namespace 都变成了匿名 namespace ,因此编译器会正确地提示您正在重新声明 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 - The C Preprocessor
关于c++ - 为什么 "#define A"会干扰 "namespace A{}"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40611979/