#ifdefおよび#ifndefの役割


99
#define one 0
#ifdef one
printf("one is defined ");
#ifndef one
printf("one is not defined ");

この中での役割は何である#ifdef#ifndef、出力は何ですか?

回答:


131

ifdef/endifor ifndef/endif ペア内のテキストは、条件に応じてプリプロセッサによって残されるか削除されます。ifdef「以下が定義されている場合」をifndef意味し、「以下が定義されていない場合」を意味します。

そう:

#define one 0
#ifdef one
    printf("one is defined ");
#endif
#ifndef one
    printf("one is not defined ");
#endif

以下と同等です。

printf("one is defined ");

以来、oneそのように定義されているifdef事実であるとifndeffalseです。それが何として定義されているかは関係ありません。これに似た(私の意見ではより良い)コードは次のようになります。

#define one 0
#ifdef one
    printf("one is defined ");
#else
    printf("one is not defined ");
#endif

これは、この特定の状況で意図をより明確に指定するためです。

特定のケースでは、の後のテキストは定義さifdefれているため削除されませんone。後にテキストifndef され、同じ理由で削除。endif次のように、ある時点で2つの終了行が必要であり、最初の行によって行が再び含まれるようになります。

     #define one 0
+--- #ifdef one
|    printf("one is defined ");     // Everything in here is included.
| +- #ifndef one
| |  printf("one is not defined "); // Everything in here is excluded.
| |  :
| +- #endif
|    :                              // Everything in here is included again.
+--- #endif

68

誰かが質問に小さな罠があることを言及する必要があります。#ifdef次のシンボルが#defineコマンドラインを介して、またはコマンドラインによって定義されているかどうかのみをチェックしますが、その値(実際にはその置換)は関係ありません。あなたも書くことができます

#define one

プリコンパイラはそれを受け入れます。しかし、使用#ifする場合は別のことです。

#define one 0
#if one
    printf("one evaluates to a truth ");
#endif
#if !one
    printf("one does not evaluate to truth ");
#endif

与えone does not evaluate to truthます。キーワードをdefined使用すると、目的の動作を取得できます。

#if defined(one) 

したがって、 #ifdef

#ifコンストラクトの利点は、コードパスのより適切な処理を可能にすることです。古い#ifdef/ #ifndefペアでそのようなことを試みてください。

#if defined(ORA_PROC) || defined(__GNUC) && __GNUC_VERSION > 300

0

「#if one」は、「#define one」が書き込まれている場合は「#if one」が実行され、それ以外の場合は「#ifndef one」が実行されることを意味します。

これは、C言語のif、then、else分岐ステートメントに相当するCプリプロセッサ(CPP)ディレクティブにすぎません。

つまり、{#define one}の場合、printf( "oneは真と評価されます"); それ以外の場合、printf( "1つは定義されていません"); したがって、#define 1つのステートメントがない場合は、ステートメントのelse分岐が実行されます。


4
これが何を追加するのかはわかりませんが、他の回答ではまだカバーされておらず、あなたの例はCまたはC ++ではありません。
-SirGuy

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.