CまたはC++で定義された次のコードの結果はありますか?条件付き命令の拡大を未定義の動作として考えられるようdefined
を使用定義済みの結果を#defineに割り当てることはできますか?
#define FOO
#define BAR defined(FOO)
#if BAR
int x = 1;
#else
int x = 2;
#endif
CまたはC++で定義された次のコードの結果はありますか?条件付き命令の拡大を未定義の動作として考えられるようdefined
を使用定義済みの結果を#defineに割り当てることはできますか?
#define FOO
#define BAR defined(FOO)
#if BAR
int x = 1;
#else
int x = 2;
#endif
。
トークン
defined
この置換の結果として生成される場合 プロセス又はdefined
単項演算子の使用は、従来のマクロ置換の 指定された2つの形式のいずれか、挙動と一致しません は未定義です。
これらのマクロ名をなし、も識別子
defined
、は#define
の#undef
対象または前処理指令なければなりません。
defined
オペレータはマクロ展開の結果として表示された場合は、 C規格では、動作が定義されていないと言います。 GNU cppはそれを 本物の定義済み演算子として扱い、それを通常通り評価します。コマンドライン のオプション '-pedantic'を使用する場合、コードがこの機能を使用するところでは、他のコンパイラがこれを別々に処理する可能性があるので、 に警告します。
これは、回答の解決方法(ifdef-defineの方法)とは異なることに注意してください。あなたのものは遅れているので、 'FOO'がどこに定義されているかによって、' BAR'はコードのさまざまな部分で異なるものに展開することができます。例:http://coliru.stacked-crooked.com/a/37e940a76f0fa896 – chris
Eww、私はそれを取ります。私はこれがプリプロセッサの中でUBを下ろそうとしている人々によって対処されているものの1つであることを願っています。これはむしろ直感的ではないからです。 – chris