#ifndef 为什么要使用类名以外的其他名称
#ifndef why to use an other name than the class name?
类声明通常如下所示:
#ifndef MY_CLASS_20141116
#define MY_CLASS_20141116
...
class MyClass
{
...
}
#endif
我的问题是,为什么不使用类名而不是重新定义新的标识符:
#ifndef MyClass
...
class MyClass
{
}
#endif
我想它与标识符冲突(相同的标识符可能出现两次)或使用命名空间(我不知道是否可以在 #ifndef 指令中使用像 std::array 这样的完整标识符)有关。
这将是一个很好的更彻底的解释。
另外,使用命名空间时可以使用第二个测试吗?
#ifndef A::MyClass //not compile, any equivalent?
namespace A
{
...
class MyClass
{
}
}
#endif
第一个例子:
#ifndef MyClass
...
class MyClass
{
}
#endif
这是行不通的,因为"MyClass"从未为预处理器定义。所有以 #
开头的指令都是预处理器指令,并且是预处理器唯一理解的指令。 class MyClass
对预处理器没有特殊含义,并且不会创建预处理器定义。
要使其正常工作,您必须定义MyClass
:#define MyClass
。但是,通过这样做,预处理器将class MyClass
替换为 class
,这不会编译。
现在,第二个示例:
#ifndef A::MyClass //not compile, any equivalent?
A::MyClass
不是预处理器令牌,而是多个令牌。 #define SOMETHING
只能使用一个令牌(由字符a-zA-Z_0-9
组成)。
相关文章:
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- 为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效
- 为什么在其他输出线之间得到"1"输出?
- 为什么 memcpy() 和其他类似的函数使用汇编?
- 为什么 c++ 中的 main() 函数不采用除 int 和 void 之外的任何其他返回类型
- 为什么这个选择排序算法仍然切换一个元素,当它已经是其他元素中最小的元素时?
- 为什么重载运算符可以返回其返回类型以外的其他内容?
- CMake:为什么added_subdirectory对其他子目录不可见
- 为什么我可以访问其他班级的私人成员?
- 为什么最后一个推回向量的对象的字段会转移到向量的其他对象?
- 为什么 ADL 的运算符函数行为与其他函数不同?
- 为什么我的 while 循环对于特定输入中断,而对于其他输入工作正常?
- 为什么当我没有变量或其他任何命名的东西时"no match for 'operator==' "错误?
- 使用 CMake 与其他静态库链接的静态库 - 一个有效,一个无效。为什么?
- 为什么在某些编译器中可以声明像int myarr[noconstant]这样的数组;而不是在其他编译器中?
- 为什么构造函数的虚拟函数调用有时有效,但其他调用却无效
- 相同的 for 循环适用于其他项目,但不适用于此项目。为什么?
- 为什么C++让你把"->"符号放在指针上,把"."符号放在其他所有东西上?
- 如果有 constexpr if 语句,为什么没有其他 constexpr 语句呢?
- 为什么第一行会出现零以外的其他值?