类声明通常如下所示:
#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
答案 0 :(得分:2)
第一个例子:
#ifndef MyClass
...
class MyClass
{
}
#endif
这不起作用,因为' MyClass'永远不会为预处理器定义。所有以#
开头的指令都是预处理程序指令,并且是预处理器唯一理解的指令。 class MyClass
对预处理器没有特殊意义,也不会创建预处理器定义。
要使其发挥作用,您必须定义MyClass
:#define MyClass
。
但是,通过这样做,预处理器将class MyClass
替换为class
,won't compile。
现在,第二个例子:
#ifndef A::MyClass //not compile, any equivalent?
A::MyClass
不是预处理程序令牌,它是几个令牌。 #define SOMETHING
仅使用一个令牌(由字符a-zA-Z_0-9
组成)。