当我尝试按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
,但错误仍然存在。
答案 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的代码,所以保持这个代码很小。