Enum class 作用域解析运算符

Enum class scope resolution operator

当我尝试通过 g++ test.cc --std=c++14 编译 test.cc 时,出现以下错误。

test.cc:5:26: error: expected unqualified-id before numeric constant
Colour colour = Colour::None;

test.cc

#include "state.h"
#include <X11/X.h>

int main(){
        Colour colour = Colour::None;
}

state.h

enum class Colour { None, Black, White };

而且我发现#include <X11/X.h>,None被定义为常数

 #define None                 0L /* universal null resource or null atom */

困扰我的是,我已经使用范围解析运算符,即Colour::None,来指定我指的是哪个None,但错误仍然发生。

恐怕这就是生活,它集中体现了宏之所以糟糕的原因。

一旦你 #included <X11/X.h>,预处理器将分解你的源代码,编译器将看到

Colour colour = Colour::0;

这毫无意义。

一个修复方法是 #undef None 包含文件后。

你有提问吗?

无论如何,一个可能的前进方向是稍微重构您的代码。我会做的是

a) 仅在 1 个 cpp 文件中执行“#include < X11/X.h >”,也许将其命名为 x11x.cpp.

然后,当你需要使用X11/X.h代码的函数时,

2a) 在 x11x.hpp.

中添加函数声明(即可能 'void foo1(int)')

2b) 并实现您的 'foo1(int)' 以调用 x11x.cpp.

中的 "X11/X.h" 函数

应该对性能影响很小。

现在这个不幸的宏只会干扰 x11.cpp 的代码,所以请保持此代码小。