为什么"#define A"会干扰"namespace 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'的重新定义
在我定义了A
和B
之后,为什么命名空间的名称变成匿名的?
使用的编译器:gcc-4.9.3
In
#define A
#define B
namespace A{
int i;
}
namespace B{
int i;
}
定义A
和B
为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预处理器
相关文章:
- "using namespace std;"在C++的作用是什么?
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- 与C代码相比,为什么C++代码不需要"#define _POSIX_C_SOURCE 200809L"?
- 以下 C++ 代码用于 -> "#define idiv(a, b) (((a) + (b) / 2) / (b))" 是什么?
- 如何以静态代码分析友好的方式使用 #define 防护?
- C++相当于整数的 #define
- #define Dbg(fmt,..) (0) 是什么意思? 警告:表达式无效
- 在C++中使用变量而不是"#define"来指定数组大小是不是一种糟糕的做法?(C错误:在文件范围内
- 为什么我需要做'using namespace std'而不是"使用 std::cout"?
- 我们可以用 C 语言嵌套 #define 和 #if 吗?
- 如何将旧的 C 样式 #define 映射与现代C++进行调整?
- 'using namespace'实现细节的便捷方法(仅标头库)?
- 找不到 #define 的函数定义
- "#define X X"是什么意思?
- C++中"typedef"、"using"、"namespace"和"using namespace"有什么区别?
- 使用 constexpr 替换 #define 和 #ifdef 进行条件编译
- C++ "using tcp=x"到"namespace tcp=x"有什么区别
- 如何解决"'mutex' in namespace 'std' does not name a type"?
- 为什么"#define A"会干扰"namespace A{}"?
- Define namespace::int class