回答:
ifdef/endif
or 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
事実であるとifndef
falseです。それが何として定義されているかは関係ありません。これに似た(私の意見ではより良い)コードは次のようになります。
#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
誰かが質問に小さな罠があることを言及する必要があります。#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
「#if one」は、「#define one」が書き込まれている場合は「#if one」が実行され、それ以外の場合は「#ifndef one」が実行されることを意味します。
これは、C言語のif、then、else分岐ステートメントに相当するCプリプロセッサ(CPP)ディレクティブにすぎません。
つまり、{#define one}の場合、printf( "oneは真と評価されます"); それ以外の場合、printf( "1つは定義されていません"); したがって、#define 1つのステートメントがない場合は、ステートメントのelse分岐が実行されます。
printfが関数ブロックにないため、コードは奇妙に見えます。