MACRO が定義されていないと仮定すると、これらは同等ですか
#ifdef MACRO
Not valid C or C++ code
#endif
/*
Not valid C or C++ code
*/
GCC 4.7.1 では同等のように見えますが、それ以上の処理を行うプリプロセッサはありますか?
MACRO が定義されていないと仮定すると、これらは同等ですか
#ifdef MACRO
Not valid C or C++ code
#endif
/*
Not valid C or C++ code
*/
GCC 4.7.1 では同等のように見えますが、それ以上の処理を行うプリプロセッサはありますか?
一般的には、どちらも同等です。
ただし、「無効な C または C++ コード」にコメントが含まれている場合、最初の形式は機能しますが、2 番目の形式は機能しません。これは、C 標準が複雑なコメントを禁止しているためです。
/* Comments /* inside */ comments are not allowed. */
ところで、その場合#if 0
はしばしば好まれ#ifdef MACRO
ます。
#if 0
Invalid C source code
#endif
この質問を参照してください。
はい、それらは同等Not valid C or C++ code
です。コンパイラーが適切なコードを見る前に、前処理段階が削除されます。
#if
前処理には、コメントの削除と編集されたコードが含まれます。
しかし、誰かが でコードをコンパイルすると-DMACRO
、その#ifdef
バージョンで問題が発生する#if 0
ため、プリプロセッサを介してコードを削除することをお勧めします。
標準の関連部分は次のC11 6.10.1 Conditional inclusion /6
とおりです。
各ディレクティブの条件が順番にチェックされます。false (ゼロ) と評価された場合、それが制御するグループはスキップされます。
つまり、さまざまな形式 (if
などifdef
) のいずれかが false と評価された場合、グループの処理は行われず、処理の後の段階で完全に削除されます。コメントにはなりません。
MACRO が定義されていない場合、それらは同等である必要があります。通常、コードの大きなチャンクをコメントアウトする一般的な方法は次のとおりです。
#if 0
code(); /* possibly with comments. */
#endif
これにより、コードにコメントが含まれている場合でも、コードの大部分を無効にすることができます。したがって、コードの一部を無効にするための通常のコメントよりも優れています。
ただし、注意点があります。次のようなもので窒息するコンパイラに遭遇しました:
#ifdef __GNUC__
#nonstandardpreprocessordirective
#endif
「nonstandardpreprocessordirective」は、GCC でのみ機能するプリプロセッサ ディレクティブです。これについて標準が何を言っているのか正確にはわかりませんが、過去に実際に問題が発生しました。ただし、どのコンパイラかは覚えていません。
いいえ、最終的なコードでは、 内にコードの痕跡はありません#ifdef
:
// before
#ifdef MACRO
Not valid C or C++ code
#endif
// after
プリコンパイル後:
// before
// after
そこには残りのコードはありません。
それらは近いですが、完全ではありません。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
を無効にするためのものです。任意のテキストをソースに含めるべきではありません。
はい、ほとんどのプリプロセッサ (すべてではないにしても) は両方とも削除され、コメントとディレクティブは 0 に評価されます。2 つの違いはほとんど機能的です。
私のアドバイスは、ディレクティブを使用してコードを「コメント」し (#if 0 {} #endif)、コメントをコメントするためだけに使用することです (論理的に正しいでしょうか?)。主な理由は次のとおりです。
#if 0 ... #if 1 #endif ... #endif
//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