2013-04-19 8 views
5

列挙値はいつ解決されますか?つまり、次のコードスニペットは標準に準拠していますか?前処理時またはコンパイル時に列挙型の値が解決されていますか?

enum{ 
    A, 
    B, 
    MAX 
} 

#if MAX > 42 
# error "Woah! MAX is a lot!" 
#endif 
+1

enumsはプリプロセッサとは関係ありません。 –

+0

@Michael Burr、上記のコードは実際にはMSVC6.0で警告なしでコンパイルされます。それはC89のようなものです。 – Vorac

+2

私はそれがenumで二重 'u'でコンパイルされないと思います! –

答えて

6

プリプロセッサは列挙型とは関係ありません。しかし、あなたのサンプルはエラーなしでコンパイルされるので、#if MAX > 42ディレクティブで何が起こっていますか?

プリプロセッサは、条件ディレクティブを処理しているときはいつでも、マクロとして定義されていない任意の識別子がそうMAXがマクロとして他の場所で定義されていないと仮定して0として扱われ、コードのスニペットは同等です:

C99 6.10.1/3「条件付き包含」から
enum{ 
    A, 
    B, 
    MAX 
} 

#if 0 > 42 
# error "Woah! MAX is a lot!" 
#endif 

...マクロ展開と定義 単項演算子によるすべての置換が行われた後、残りのすべての識別子が ありますpp-number 0に置き換えられ、各前処理トークンは がトークンに変換されます。 ...

同じ表現がC89/C90規格にあります。

+0

このような私の部分からの愚かな間違い!これをクリアしていただきありがとうございます。 – Vorac

関連する問題