与えられた:
#error /*
*/ foo
Microsoft C++ は/*
、GCC 出力のエラー メッセージを出力しますfoo
。
どちらが正しい?
GCCは正しいです。
コメント (改行を含む) の置換は、翻訳フェーズ 3 で行われ、翻訳フェーズ 4 で前処理が行われます (ISO/IEC 9899:1999、§5.1.1.2)。
したがって、コンパイラの前処理部分は改行を「認識」しなくなります。
そして、#error
次のように定義されています (§6.10.5):
フォームの前処理ディレクティブ
# error pp-tokens_opt new-line
実装により、指定された一連の前処理トークンを含む診断メッセージが生成されます。
したがって、foo
は出力の一部である必要があります。
標準では単一のスペースに置き換える必要があるため、GCC は正しいです/ * ... * /
。