私が定義する場合
#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
それが役立つことを願っています。