最近、gccでコンパイルしようとすると、次のエラーが発生しました。
エラー:トークン "("の前に2項演算子がありません
WebおよびSO検索では、このエラーのいくつかの具体的な例があり、それらを修正するための特定のコード変更が行われました。しかし、このエラーが発生する原因となる条件の一般的な説明は見つかりませんでした。
いつ、なぜgccはこのエラーを出しますか?
これはコンパイラエラーではなく、プリプロセッサエラーです。これは、プリプロセッサが#if
または#Elif
ディレクティブの式を評価しようとしたときに無効な構文を検出したときに発生するようです。
一般的な原因の1つは、#if
ディレクティブのsizeof
演算子です。
例えば:
#define NBITS (sizeof(TYPE)*8)
//later
#if (NBITS>16) //ERROR
sizeof
はプリプロセッサー ではなくコンパイラーによって評価されるため、これはエラーです。
型キャストも有効なプリプロセッサ構文ではありません。
#define ALLBITS ((unsigned int) -1)
//later
#if (ALLBITS>0xFFFF) //ERROR
有効な式に含めることができるものの ルールはここにあります 。
また、#if
は未定義のマクロを0として評価します。ただし、引数を取るように見えない場合は、このエラーが発生します このエラーも表示されます :
したがって、THIS
が定義されていない場合:
#if THIS == 0 //valid, true
#if THIS > 0 //valid, false
#if THIS() == 0 //invalid. ERROR
#if
ステートメントの入力ミス もこのメッセージを引き起こす可能性があります。
Linuxを使用している場合は、プロジェクトファイル内にfeatures.h
という名前のヘッダーがないことを確認してください。私はこの名前のものがあり、その結果は次のようになりました:
/usr/include/x86_64-linux-gnu/bits/huge_val.h:25:エラー:関数ポインタが必要です
または
/usr/include/bits/huge_val.h:26:18:エラー:トークン "("の前にバイナリ演算子がありません
これは、huge_val.h
などの一部のシステムヘッダーが、__GNUC_PREREQ
で定義されている/usr/include/features.h
などのマクロを使用しているためです(このヘッダーの詳細 in this SO =質問 )。
私の場合、gccの-Iオプションを使用し始めたときに最初にこのエラーが発生しました。これにより、gccが突然プロジェクトインクルードディレクトリbeforeを選択し、デフォルトのシステムインクルードディレクトリを選択しました。 。
コンパイラフラグに-fno-operator-names
があると、このエラーが発生することがあります。 json
のビルド中に正確なエラーが発生し、これで解決しました。