2016-05-12 7 views
2

にアポストロフィを持つ警告:コマンドラインで私はファイル(error_c11.cpp)をコンパイルしようとすると、その内容があり、#エラープリプロセッサディレクティブ

#if 0 
#error This shouldn't be a problem 
#endif 

gcc error_c11.cpp 

私が手次の警告(そして主に関するいくつかの他のリンカーエラー):逆

error_c11.cpp:2:20: warning: missing terminating ' character 
#error This shouldn't be a problem 

、と同じコンパイルまたはVisual Studioでは警告が表示されません。これは、(v4.9.3を使用して)gccのバグである、または、'文字が#errorプリプロセッサディレクティブで許可されていない、と他のコンパイラはより寛大ですか?

+1

文法によると、それは*#のエラーです*文字リテラル*含む、*の前処理トークン* 1以上である* ppのトークン*改行*を、PPは、トークン。これが無効な構文であることがわかりました。 – chris

+1

これは実際には_ワーニングです。 C-プリプロセッサでさえ、スタティックコード解析でAI機能を使う傾向があるようです。 –

+0

メッセージを二重引用符で囲みます。理想的ではないエラーメッセージが表示され、引用するとエラーが発生するが、それは近いです –

答えて

3

#errorディレクティブの構文は次のとおりです。

#errorPP-トークンオプト新ライン

PP-トークンはプリプロセッサですトークン。アポストロフィは、それが(おそらくまたはリテラル文字列、またはヘッダ名)文字定数の一部だ場合にのみ、プリプロセッサトークンに表示されます。 #errorを以下

トークンは文法的に正しいことがありませんが、有効なトークンでなければなりません。

回避策:

#if 0 
#error "This shouldn't be a problem" 
#endif 

あなたも記述することができます。その場合

#if 0 
#error This shouldn't be a problem, m'kay? 
#endif 

を、't be a problem, m'は、この文脈でナンセンスが、合法である複数文字定数として扱われます。

(余談:エイダは属性または修飾表現を導入するための単一のアポストロフィを使用しているため、エイダコードにCプリプロセッサを適用する試みは、同様の問題に実行している)

関連する問題