繁体   English   中英

为什么“#define A”会干扰“命名空间A {}”?

[英]Why does “#define A” interfere with “namespace A{}”?

以下代码可以编译:

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。

#define A
#define B

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

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

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预处理器

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM