0

类声明通常如下所示:

#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
4

1 回答 1

2

第一个例子:

#ifndef MyClass

...

class MyClass
{
}

#endif

这是行不通的,因为从未为预处理器定义“MyClass”。所有以 a 开头的#指令都是预处理器指令,并且是预处理器唯一可以理解的指令。class MyClass对预处理器没有特殊意义,也不会创建预处理器定义

为了让它工作,你必须定义MyClass: #define MyClass。但是,通过这样做,预处理器将替换class MyClassclass,这将不会编译

现在,第二个例子:

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

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

于 2014-11-16T13:11:02.807 回答