web-dev-qa-db-ja.com

ifdefのブール値:「#ifdef A && B」は「#if defined(A)&& defined(B)」と同じですか?

C++では、これは次のとおりです。

#ifdef A && B

と同じ:

#if defined(A) && defined(B)

そうではないと思っていましたが、コンパイラ(VS2005)との違いを見つけることができませんでした。

76
criddell

それらは同じではありません。最初のものは動作しません(gcc 4.4.1でテストしました)。エラーメッセージ:

test.cc:1:15:警告:#ifdefディレクティブの最後に追加のトークン

複数のものが定義されているかどうかを確認する場合は、2番目のものを使用します。

81
Evan Teran

条件付きコンパイル

#ifディレクティブで定義済みの演算子を使用して、プリプロセッサ行内で0または1に評価される式を使用できます。これにより、ネストされた前処理ディレクティブを使用する必要がなくなります。識別子を囲む括弧はオプションです。例えば:

#if defined (MAX) && ! defined (MIN)  

定義済みの演算子を使用しない場合、上記の例を実行するには、次の2つのディレクティブを含める必要があります。

#ifdef max 
#ifndef min
44

次の結果は同じです。

1。

#define A
#define B
#if(defined A && defined B)
printf("define test");
#endif

2。

#ifdef A
#ifdef B
printf("define test");
#endif
#endif
1
way good

OPとは少し異なる例(UNIX/g ++)を探しているかもしれない人のために、これは役に立つかもしれません:

`

#if(defined A && defined B && defined C)
    const string foo = "xyz";
#else
#if(defined A && defined B)
    const string foo = "xy";
#else
#if(defined A && defined C)
    const string foo = "xz";
#else
#ifdef A
    const string foo = "x";
#endif
#endif
#endif
#endif
1
MikeB