【问题标题】:#ifndef why to use an other name than the class name?#ifndef 为什么要使用除类名之外的其他名称?
【发布时间】: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


【解决方案1】:

第一个例子:

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

【讨论】:

  • 你是对的,虽然 MyClass 对于未来的预处理器操作是可见的,但我在测试中错过了。谢谢。
猜你喜欢
  • 2011-02-27
  • 1970-01-01
  • 2020-01-14
  • 1970-01-01
  • 1970-01-01
  • 2021-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多