#ifndef为什么要使用除类名之外的其他名称?

时间:2014-11-16 12:54:19

标签: c++ namespaces ifndef

类声明通常如下所示:

#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

1 个答案:

答案 0 :(得分:2)

第一个例子:

#ifndef MyClass

...

class MyClass
{
}

#endif

这不起作用,因为' MyClass'永远不会为预处理器定义。所有以#开头的指令都是预处理程序指令,并且是预处理器唯一理解的指令。 class MyClass对预处理器没有特殊意义,也不会创建预处理器定义

要使其发挥作用,您必须定义MyClass#define MyClass。 但是,通过这样做,预处理器将class MyClass替换为classwon't compile

现在,第二个例子:

#ifndef A::MyClass //not compile, any equivalent?

A::MyClass不是预处理程序令牌,它是几个令牌。 #define SOMETHING仅使用一个令牌(由字符a-zA-Z_0-9组成)。