web-dev-qa-db-ja.com

#ifdefおよび#ifndefの役割

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

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

90
alka pandey

ifdef/endifまたはifndef/endifpair内のテキストは、状態に応じてプリプロセッサによって残されるか削除されます。 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の後のテキストは削除されません。 ifndefisの後のテキストは同じ理由で削除されました。ある時点で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
127
paxdiablo

誰かが質問に小さな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
63

Printfは関数ブロックにないため、コードは奇妙に見えます。

0
hwx

「#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ブランチが実行されます。

0
Rodders