web-dev-qa-db-ja.com

コンパイラエラー「トークンの前にバイナリ演算子がありません」とはどういう意味ですか?

最近、gccでコンパイルしようとすると、次のエラーが発生しました。

エラー:トークン "("の前に2項演算子がありません

WebおよびSO検索では、このエラーのいくつかの具体的な例があり、それらを修正するための特定のコード変更が行われました。しかし、このエラーが発生する原因となる条件の一般的な説明は見つかりませんでした。

いつ、なぜgccはこのエラーを出しますか?

18
AShelly

これはコンパイラエラーではなく、プリプロセッサエラーです。これは、プリプロセッサが#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ステートメントの入力ミス もこのメッセージを引き起こす可能性があります。

34
AShelly

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を選択し、デフォルトのシステムインクルードディレクトリを選択しました。 。

2

コンパイラフラグに-fno-operator-namesがあると、このエラーが発生することがあります。 jsonのビルド中に正確なエラーが発生し、これで解決しました。

0
Yusuf Gören