2017-01-20 11 views
-2

CまたはC++で定義された次のコードの結果はありますか?条件付き命令の拡大を未定義の動作として考えられるようdefinedを使用定義済みの結果を#defineに割り当てることはできますか?

#define FOO 
#define BAR defined(FOO) 
#if BAR 
    int x = 1; 
#else 
    int x = 2; 
#endif 
+1

これは、回答の解決方法(ifdef-defineの方法)とは異なることに注意してください。あなたのものは遅れているので、 'FOO'がどこに定義されているかによって、' BAR'はコードのさまざまな部分で異なるものに展開することができます。例:http://coliru.stacked-crooked.com/a/37e940a76f0fa896 – chris

+0

Eww、私はそれを取ります。私はこれがプリプロセッサの中でUBを下ろそうとしている人々によって対処されているものの1つであることを願っています。これはむしろ直感的ではないからです。 – chris

答えて

5

トークンdefinedこの置換の結果として生成される場合 プロセス又はdefined単項演算子の使用は、従来のマクロ置換の 指定された2つの形式のいずれか、挙動と一致しません は未定義です。

これらのマクロ名をなし、も識別子defined#define#undef対象または前処理指令なければなりません。

definedオペレータはマクロ展開の結果として表示された場合は、 C規格では、動作が定義されていないと言います。 GNU cppはそれを 本物の定義済み演算子として扱い、それを通常通り評価します。コマンドライン のオプション '-pedantic'を使用する場合、コードがこの機能を使用するところでは、他のコンパイラがこれを別々に処理する可能性があるので、 に警告します。

+1

ありがとう!その見積もりの​​出典がありますか? – thetic

+0

私は標準から最初にリファレンスを与えることをお勧めします。特定の実装の動作は異なります。 (すなわち、標準は、逆ではなく、コンパイラ/プリプロセッサの正確さを評価するための基礎である)。 – Peter

+0

これはすでに完了です。 –

関連する問題