8

C言語標準によれば、との間の行#if 0#endif前処理トークンを含むためにのみ必要であるため、ほとんどの種類の完全に不正な構文、たとえば#fooor#include [bar]は許可されます(黙って無視されます)。GCCとMicrosoftC++は、実際にそのようなことを黙って無視します。

@私が見る限り、Anは前処理トークンに対応していないので、構文エラーであるはずです。GCCとMicrosoftC++は黙ってそれを無視します。これは事実上言語拡張ですか、それとも何かが足りませんか?

誰かが実際に不正な形式の構文を実際に配置する機能を使用してい#if 0ます#endifか?

4

3 に答える 3

13

C標準とC++標準の両方で、文法に特別な「エスケープ句」が含まれているため、空白以外のすべての文字が前処理トークン(の一部)になります。このため、ブロックの間に何を入れて#if 0#endif、コンパイルエラーが発生することはほとんどありません。唯一の例外は、文字リテラルと文字列リテラルの引用符の不一致です。

そして、はい、私は定期的に不正な形式の構文をとの間に置き、#if 0部分#endif的に記述されたコードを無効にします。

于 2013-01-07T11:31:43.257 に答える
2

プリプロセッサは、次のように聞こえます。コンパイラの前に(プリ)ファイルを処理します。実際のコンパイラーが認識する入力は、プリプロセッサーがフィードするものであり、コードの一部が#if 0と一致するものの間にある#endif場合、コンパイラーはそのコードさえも認識しません。そのため、そのセクションにはほとんど何でも入れることができ、コンパイラーはそれを認識しません。

于 2013-01-07T11:31:07.627 に答える
2

#if 0と#endifの間のコードは、最終的なソースコードに含まれません(プロセッサごとの出力後)。Visual Studioを使用していて、プリプロセッサの出力を表示する場合は、プロジェクトプロパティに移動し、[C /C++を選択]->[プリプロセッサを選択]->[ファイルへの前処理]オプションで[はい]を選択します。

プロジェクトディレクトリに移動すると、「。i」ファイルが表示されます。これはプリプロセッサの出力です。

そして、#if0と#endifの間のコードが含まれていないことがわかります。したがって、エラーの問題はありません。

于 2013-01-07T11:51:24.850 に答える