以下代码可以编译:
namespace A{
int i;
}
namespace B{
int i;
}
int main(){ return 0; }
Run Code Online (Sandbox Code Playgroud)
但是下面的代码无法编译:
#define A
#define B
namespace A{
int i;
}
namespace B{
int i;
}
int main(){ return 0; }
Run Code Online (Sandbox Code Playgroud)
错误信息是
错误:重新定义'int {anonymous} :: i'
在我定义之后A,B为什么命名空间的名称变成匿名?
使用的编译器:gcc-4.9.3.
Nat*_*ica 13
在
#define A
#define B
namespace A{
int i;
}
namespace B{
int i;
}
Run Code Online (Sandbox Code Playgroud)
你定义A并且B什么都不是.这意味着你的代码变成了
namespace {
int i;
}
namespace {
int i;
}
Run Code Online (Sandbox Code Playgroud)
预处理器运行后.由于两个名称空间都成为匿名名称空间,因此编译器会正确地抱怨您正在重新声明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;
}
Run Code Online (Sandbox Code Playgroud)
然后预处理器会将代码更改为
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;
}
Run Code Online (Sandbox Code Playgroud)
有关预处理器如何工作的更多信息,请参阅:GCC - C预处理器
| 归档时间: |
|
| 查看次数: |
115 次 |
| 最近记录: |