#ifndef 为什么要使用类名以外的其他名称

#ifndef why to use an other name than the class name?

本文关键字:其他 为什么 #ifndef      更新时间:2023-10-16

类声明通常如下所示:

#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组成)。

相关文章: