2017-11-11 7 views
3

test.ccをg++ test.cc --std=c++14でコンパイルしようとしたときに、次のエラーが発生しました。列挙型スコープ解決演算子

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 */ 

として定義されていることがわかります私は既に参照しているNoneを指定するためにスコープ解決演算子、つまりColour::Noneを使用しましたが、エラーはまだ発生しています。

+3

プリプロセッサはスコープを気にしません。マクロはマクロです。 – melpomene

答えて

5

それは私が恐れていることであり、マクロがひどくなる理由を示しています。

あなたは#include D <X11/X.h>をしたら、プリプロセッサは、ソースコードをかむし、コンパイラが意味をなさない

Colour colour = Colour::0; 

が表示されます。

ファイルを添付した後、修正は#undef Noneになります。

0

質問がありましたか?

とにかく、進むべき方向は、コードを少しリファクタリングすることです。私がすることは

です。a)「#include < X11/X.h>」を1 cppファイルで実行します。これはおそらくx11x.cppと呼ばれます。

あなたはX11/X.hコードの機能を使用する必要があり、これまで続いて

2a)はx11x.hppでの関数宣言(すなわち、おそらく '無効foo1は(int)を')を追加します。

2b)x11x.cppの "X11/X.h"関数を呼び出すための 'foo1(int)'を実装してください。

パフォーマンスにはほとんど影響しません。

そして、不幸なマクロはx11.cppのコードにしか干渉しないので、このコードを小さくしてください。

関連する問題