【发布时间】:2014-11-16 12:54:18
【问题描述】:
类声明通常如下所示:
#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
【问题讨论】:
-
有没有类的 h 文件,也有带几个类的 h 文件。关于你的第二个问题,不要期望预处理器和编译器一样聪明。
-
你是对的,但是在(非常常见的)标题中只有一个类的情况下?
-
还有
#pragma once可以为您解决这个问题。虽然它是非标准的,但所有常见的编译器都支持它。 -
#ifndef由预处理器处理,而不是编译器。预处理器对命名空间一无所知。您可以只使用简单的标识符。如果定义MyClass,预处理器也会替换class MyClass。这肯定不是你想要的。 -
据我了解,预处理器可以访问已定义的标识符,其中包括已包含的类名。所以我猜 A::MyClass 必须有预处理器的任何类型的内部标识符/表示。
标签: c++ namespaces ifndef