2012-03-28 8 views

答えて

7
#define MACRO 0 

MACROトークンプリプロセッサはリテラル0

#undef MACRO 

であることを定義し、それは存在しなかったかのようにだようにトークンプリプロセッサの定義MACROを削除します。例えば

:それらの

#define MACRO 0 

#if defined (MACRO) 
// we get here 
#endif 

#if (MACRO) 
// we don't get here 
#endif 

#undef MACRO 

#if defined (MACRO) 
// we don't get here 
#endif 
+2

もう一つの例として、 '#undef MACRO'の直後の' #define MACRO 1'はOKですが、 '#define MACRO 0'の直後の' #define MACRO 1'はOKではありません。 –

1

一つは、特定の状況において、マクロ識別子の出現は、プリプロセッサによって0に置き換えられるようにマクロを定義します。もう1つはマクロの定義を削除し、識別子が同じコンテキストで見つかった場合にプリプロセッサで何も置き換えられず、そのままにします。この中

#define MACRO 0 

int main() 
{ 
    return MACRO; 
} 

:たとえば

、プリプロセッサはこのターン

int main() 
{ 
    return 0; 
} 

をしかし、それはこのターンになります。これに

#define MACRO 0 
#undef MACRO 

int main() 
{ 
    return MACRO; 
} 

int main() 
{ 
    return MACRO; 
} 

2番目の例では、Cコンパイラは識別子MACROに遭遇し、おそらく宣言されていないというエラーが発生し、コンパイルが失敗する可能性があります。シンボルが定義されない最初の場合に

1

(MACROの#ifdef「が入る」ではないだろう)、第二のケースでは、「0」

3

を0として定義されたマクロがまだ定義されているように定義されたマクロを有しています。

#define VAL 0 
#ifdef VAL 
    // VAL is defined so this part will be entered 
    printf("%d", VAL); // <- prints "0" 
#endif 

#undef VAL 
#ifdef VAL 
    // Val is now undefined, this part will not be entered 
#endif 
2

違いは、 "未定義"は "0"と同じではありません(用途によって異なる)。

ブール値のコンテキストで使用されます。 #if MY_MACROの場合、違いはありません(未定義はfalseに変換されるため)。

あなたが定義するいくつかのマクロをチェックしかし、一度、違いがあります:一般的に

// this macro is defined but empty. 
// #ifdef MY_MACRO would evaluate to true/be included 
// #if MY_MACRO would evaluate to false/not be included 
// occurances would be deleted, e.g. 'something = MY_MACRO;' would be changed to 'something = ;' 
#define MY_MACRO 

// this macro is defined and set to 0. 
// #ifdef MY_MACRO would evaluate to true/be included 
// #if MY_MACRO would evaluate to false/not be included 
// occurances would be replaced, e.g. 'something = MY_MACRO;' would be changed to 'something = 0;' 
#define MY_MACRO 0 

// this macro is undefined (after these lines) 
// #ifdef MY_MACRO would evaluate to false/not be included 
// #if MY_MACRO would evaluate to false/not be included 
// occurances would remain unchanged (as the macro isn't defined anymore), e.g. 'something = MY_MACRO;' would be kept as 'something = MY_MACRO;' 
#define MY_MACRO Hello! 
#undef MY_MACRO 

は: #defineは常に何らかの値を代入して定義されたマクロを作ります。たとえ新しい値が "空"であっても。 #undefはマクロ定義を常に削除して未定義にします。発生はもはや置き換えられません。

関連する問題