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

标签 c++ namespaces

以下代码可以编译:

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'

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

使用的编译器:gcc-4.9.3。

最佳答案

#define A
#define B

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

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

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/

相关文章:

struct init 的 C++ vector

c++ - 链接时 Visual C++ 2008 应用程序中出现名称重整 declspec 不匹配的链接错误

c++ - 使用重载运算符 () 在 C++ 中复制构造函数

php - fatal error : Uncaught Error: Class not found in dynamic variable namespace

c++ - AIX 上 Netbeans 6.8 中的 STL 命名空间问题

c++ - std::variant 与 std::any 当类型可移动构造时

C++ 比较两个结构以显示有什么区别

php - CakePHP 和命名空间?

PHP 全局命名空间别名

c++ - 不相关的删除运算符改变了重载决议的行为