8

MACRO が定義されていないと仮定すると、これらは同等ですか

#ifdef MACRO
    Not valid C or C++ code
#endif

/*
    Not valid C or C++ code
*/

GCC 4.7.1 では同等のように見えますが、それ以上の処理を行うプリプロセッサはありますか?

4

8 に答える 8

7

一般的には、どちらも同等です。

ただし、「無効な C または C++ コード」にコメントが含まれている場合、最初の形式は機能しますが、2 番目の形式は機能しません。これは、C 標準が複雑なコメントを禁止しているためです。

 /* Comments /* inside */ comments are not allowed. */

ところで、その場合#if 0はしばしば好まれ#ifdef MACROます。

#if 0
    Invalid C source code
#endif

この質問を参照してください。

于 2013-06-14T08:50:25.620 に答える
5

はい、それらは同等Not valid C or C++ codeです。コンパイラーが適切なコードを見る前に、前処理段階が削除されます。

#if前処理には、コメントの削除と編集されたコードが含まれます。

しかし、誰かが でコードをコンパイルすると-DMACRO、その#ifdefバージョンで問題が発生する#if 0ため、プリプロセッサを介してコードを削除することをお勧めします。

于 2013-06-14T08:50:44.217 に答える
1

標準の関連部分は次のC11 6.10.1 Conditional inclusion /6とおりです。

各ディレクティブの条件が順番にチェックされます。false (ゼロ) と評価された場合、それが制御するグループはスキップされます。

つまり、さまざまな形式 (ifなどifdef) のいずれかが false と評価された場合、グループ処理は行われず、処理の後の段階で完全に削除されます。コメントにはなりません。

于 2013-06-14T08:55:47.500 に答える
0

MACRO が定義されていない場合、それらは同等である必要があります。通常、コードの大きなチャンクをコメントアウトする一般的な方法は次のとおりです。

#if 0
code(); /* possibly with comments. */
#endif

これにより、コードにコメントが含まれている場合でも、コードの大部分を無効にすることができます。したがって、コードの一部を無効にするための通常のコメントよりも優れています。

ただし、注意点があります。次のようなもので窒息するコンパイラに遭遇しました:

#ifdef __GNUC__
#nonstandardpreprocessordirective
#endif

「nonstandardpreprocessordirective」は、GCC でのみ機能するプリプロセッサ ディレクティブです。これについて標準が何を言っているのか正確にはわかりませんが、過去に実際に問題が発生しました。ただし、どのコンパイラかは覚えていません。

于 2013-06-14T09:02:25.657 に答える
0

いいえ、最終的なコードでは、 内にコードの痕跡はありません#ifdef:

// before
#ifdef MACRO
    Not valid C or C++ code
#endif
// after

プリコンパイル後:

// before
// after

そこには残りのコードはありません。

于 2013-06-14T08:52:56.603 に答える
0

それらは近いですが、完全ではありません。MACRO が定義されていないと仮定します(または、#if 0ここの他の回答で推奨されているように使用していると仮定します):

#ifdef MACRO
Not valid C or C++ code
*/  - does no harm
#endif  - oops
more invalid code
#endif

とコメント:

/*
    Not valid C or C++ code
    #endif - does no harm
    */ - oops
*/

コメントはコメント用であり、法的なコード#ifdefを無効にするためのものです。任意のテキストをソースに含めるべきではありません。

于 2013-06-14T09:04:49.060 に答える
0

はい、ほとんどのプリプロセッサ (すべてではないにしても) は両方とも削除され、コメントとディレクティブは 0 に評価されます。2 つの違いはほとんど機能的です。

私のアドバイスは、ディレクティブを使用してコードを「コメント」し (#if 0 {} #endif)、コメントをコメントするためだけに使用することです (論理的に正しいでしょうか?)。主な理由は次のとおりです。

  • コードの 1 行を変更するだけで、ディレクティブをアクティブ化/非アクティブ化できます。ブロック コメントでは、コードの異なる行で 2 つの要素を挿入/削除する必要があります。
  • ディレクティブは、IF ロジックを保持したまま入れ子にすることができ、ブロック コメントを含めることもできます。/ブロック コメント/ はネストできません。これは、別のコメントを含む可能性のある大きなコードにコメントを付けるときに問題になる可能性があります。
#if 0
...
#if 1
#endif
...
#endif
  • 単純な #if 0 ディレクティブは、より動的な条件付きコード処理を可能にする define または eval ディレクティブに簡単に変換できます。
//Classic verbose code line comment

#if 0
//Directive verbose line or block comment   
#endif

#define verbose 0
#if verbose
//Convenient eval directive to turn on/off this and other verbose blocks
#endif
  • ほとんどの IDE は、コメント ブロックの構文を強調表示しませんが、ディレクティブ コードの構文を強調表示します。インデントやオートコンプリートなどの他の機能でも同じことが起こります。これにより、#if 0 #endif ブロックとは対照的に、/**/ ブロックの可読性が大幅に低下します。また、コメント付きコードの編集 (行の追加や何かの修正など) は、ディレクティブを使用すると簡単です。
于 2015-09-21T09:33:58.087 に答える