#define one 0
#ifdef one
printf("one is defined ");
#ifndef one
printf("one is not defined ");
この中で#ifdef
と#ifndef
の役割は何であり、出力は何ですか?
ifdef/endif
またはifndef/endif
pair内のテキストは、状態に応じてプリプロセッサによって残されるか削除されます。 ifdef
は「次が定義されている場合」を意味し、ifndef
は「次がnot定義されている場合」を意味します。
そう:
#define one 0
#ifdef one
printf("one is defined ");
#endif
#ifndef one
printf("one is not defined ");
#endif
以下と同等です:
printf("one is defined ");
one
が定義されているため、ifdef
はtrueで、ifndef
はfalseです。何が定義されているかは関係ありませんas。それに似た(私の意見ではより良い)コードは次のようになります:
#define one 0
#ifdef one
printf("one is defined ");
#else
printf("one is not defined ");
#endif
これは、この特定の状況で意図をより明確に指定するためです。
特定のケースでは、ifdef
が定義されているため、one
の後のテキストは削除されません。 ifndef
isの後のテキストは同じ理由で削除されました。ある時点で2つのendif
行を閉じる必要があり、最初の行では、次のように行が再び含まれるようになります。
#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
誰かが質問に小さなtrapがあることに言及するべきです。 #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
Printfは関数ブロックにないため、コードは奇妙に見えます。
「#if one」は、「#define one」が書き込まれている場合、「#if one」が実行されている場合、「#ifndef one」が実行されていることを意味します。
これは、C言語のif、then、else分岐ステートメントに相当するCプリプロセッサ(CPP)指令にすぎません。
すなわち、{#define one}の場合、printf( "oneは真と評価されます");それ以外の場合printf( "one is not defined");したがって、#define oneステートメントがなければ、ステートメントのelseブランチが実行されます。