列挙値はいつ解決されますか?つまり、次のコードスニペットは標準に準拠していますか?前処理時またはコンパイル時に列挙型の値が解決されていますか?
enum{
A,
B,
MAX
}
#if MAX > 42
# error "Woah! MAX is a lot!"
#endif
列挙値はいつ解決されますか?つまり、次のコードスニペットは標準に準拠していますか?前処理時またはコンパイル時に列挙型の値が解決されていますか?
enum{
A,
B,
MAX
}
#if MAX > 42
# error "Woah! MAX is a lot!"
#endif
プリプロセッサは列挙型とは関係ありません。しかし、あなたのサンプルはエラーなしでコンパイルされるので、#if MAX > 42
ディレクティブで何が起こっていますか?
プリプロセッサは、条件ディレクティブを処理しているときはいつでも、マクロとして定義されていない任意の識別子がそうMAX
がマクロとして他の場所で定義されていないと仮定して0として扱われ、コードのスニペットは同等です:
enum{
A,
B,
MAX
}
#if 0 > 42
# error "Woah! MAX is a lot!"
#endif
:
...マクロ展開と定義 単項演算子によるすべての置換が行われた後、残りのすべての識別子が ありますpp-number 0に置き換えられ、各前処理トークンは がトークンに変換されます。 ...
同じ表現がC89/C90規格にあります。
このような私の部分からの愚かな間違い!これをクリアしていただきありがとうございます。 – Vorac
enumsはプリプロセッサとは関係ありません。 –
@Michael Burr、上記のコードは実際にはMSVC6.0で警告なしでコンパイルされます。それはC89のようなものです。 – Vorac
私はそれがenumで二重 'u'でコンパイルされないと思います! –