1

私が定義する場合

#if SOMETHING

#endif

私はどこにも何かを定義していません。#if compile 内のコードは?

4

4 に答える 4

2

の引数式で使用される名前#ifがマクロとして定義されていない場合 (他のすべてのマクロ置換が終了した後)、それは に置き換えられ0ます。これは、あなたの#if SOMETHING意志が と解釈されることを意味します#if 0。以下のコード#ifはプリプロセッサによって削除されます。

この規則は、より複雑な式にも適用されます。できるよ

#define A 42
#if A + B

#if 42不明な名前Bは次のように解釈されるため、これは に評価されます。0

于 2012-08-02T01:48:01.353 に答える
1

いいえ、SOMETHING が事前定義されたマクロの 1 つでもなく、コマンドラインでコンパイラに渡されたマクロでもない限り。

于 2012-08-02T01:35:01.503 に答える
0

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
于 2012-08-02T04:36:00.293 に答える
-1

いいえ、未定義のマクロとして、必ずしも何かに置き換えられるとは限らないため...しかし、それはおそらくコンパイラ固有のものであり、信頼できない.

あなたは使用したいかもしれません:

 #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

それが役立つことを願っています。

于 2012-08-02T02:07:58.457 に答える