枚举类范围解析运算符

时间:2017-11-11 22:22:19

标签: c++ enums

当我尝试按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,但错误仍然存​​在。

2 个答案:

答案 0 :(得分:5)

这就是我害怕的生活,它体现了宏可怕的原因。

一旦你#include d <X11/X.h>,预处理器就会咀嚼你的源代码,编译器会看到

Colour colour = Colour::0;

没有任何意义。

包含文件后,#undef None会有一个修复。

答案 1 :(得分:0)

你有问题吗?

无论如何,一个可能的方向是进行一些重构。我会做的是

a)执行&#34; #include&lt; X11 / X.h&gt;&#34;只有1个cpp文件,也许称之为x11x.cpp。

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

2a)在x11x.hpp中添加一个函数声明(即可能是&#39; void foo1(int)&#39;)。

2b)并实施你的&#39; foo1(int)&#39;打电话给&#34; X11 / X.h&#34;函数在x11x.cpp。

对性能的影响应该很小。

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