4

検討

#define FOOBAR (defined(FOO) || defined(BAR))

#if FOOBAR
/* Do stuff. */
#endif

これは機能するはずですか?どうやら私のコンパイラには問題がないので質問していますが、doxygen 内部プリプロセッサは#if. 私はこれを回避できることを知っています

#if defined(FOO) || defined(BAR)
#define FOOBAR 1
#endif
#if FOOBAR
/* Do stuff. */
#endif
4

2 に答える 2

5

C99仕様から:

6.10.1.3

評価の前に、通常のテキストと同様に、制御定数式になる前処理トークンのリスト内のマクロ呼び出しが置き換えられます (定義された単項演算子によって変更されたマクロ名を除く)。定義されたトークンがこの置換プロセスの結果として生成されるか、定義された単項演算子の使用がマクロ置換の前に指定された 2 つの形式のいずれかと一致しない場合、動作は未定義です。

したがって、実行したように展開さdefinedれるマクロを使用すると、結果は未定義になります。

C仕様のほとんどの未定義のものと同様に、標準より前の実装では異なる方法で処理されたため、未定義です。

于 2012-08-10T19:27:03.583 に答える
0

これは、コンパイラ固有の質問のように聞こえます。このコンパイラを使用している限り、試してみてください。コードを/*do stuff*/部分に入れ、コードがコンパイルされるかどうかを確認してください。

于 2012-08-10T18:10:53.367 に答える