私が定義する場合
#if SOMETHING
#endif
私はどこにも何かを定義していません。#if compile 内のコードは?
の引数式で使用される名前#ifがマクロとして定義されていない場合 (他のすべてのマクロ置換が終了した後)、それは に置き換えられ0ます。これは、あなたの#if SOMETHING意志が と解釈されることを意味します#if 0。以下のコード#ifはプリプロセッサによって削除されます。
この規則は、より複雑な式にも適用されます。できるよ
#define A 42
#if A + B
#if 42不明な名前Bは次のように解釈されるため、これは に評価されます。0
いいえ、SOMETHING が事前定義されたマクロの 1 つでもなく、コマンドラインでコンパイラに渡されたマクロでもない限り。
C99ではデフォルトで0に設定されていると思いますが、C89ではそうではなく、エラーが発生します
Source code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define A 42
#define B 
int main(int argc, char *argv[]){
int c;
#if A
c = A + B;
#endif
printf("%d\n",c);
return 0;
}
Error : 
error: expected expression before ‘;’ token
    いいえ、未定義のマクロとして、必ずしも何かに置き換えられるとは限らないため...しかし、それはおそらくコンパイラ固有のものであり、信頼できない.
あなたは使用したいかもしれません:
 #ifdef DEFINED_WORD
 #ifndef DEFINED_WORD
DEFINED_WORD は、次のように #define で宣言されます  #define DEFINED_WORD。コンストラクトは、それと DEFINED_WORD が定義されている場合の間のifdefコードのみをコンパイルします。#endifについてはその逆です#ifndef。次のようにネストできます。
 #ifdef DEFINED_WORD
 printf ( "DEFINED_WORD is defined\n" );
 #ifndef DEFINED_WORD
 printf ( "This line will NEVER print\n" );
 #endif
 printf ( "This line will print if DEFINED_WORD is defined\n" );
 #endif
 printf ( "This line will ALWAYS print.\n" );
私のコードには、次のような構造があります。
 #ifdef DEBUG
 printf ( "array[%d] = %d\n", i, array[i] );
 #endif
すべての DEBUG コードを無効にするには、それを呼び出す前に必要な行をコメント アウトします#ifdef(ソース ファイルの先頭、またはソース ファイルの先頭に適切な形式で含めたインクルード ヘッダー内)。#define DEBUG
それが役立つことを願っています。