2011-09-07 12 views
10

は、異なるコンパイラ(gcc、visual cなど)で常に同じ列挙型のサイズです。つまり、特定の列挙型のsizeof()は、C/C++標準に準拠するすべてのコンパイラで同じ値を与えますか? CとCの両方において異なるコンパイラのバイト単位の列挙サイズ

+0

また、署名の度合いも異なる場合があります。 –

答えて

14

を++列挙は、すべての値が表現され、整数型と適合することができるようなサイズを有することになります。異なるコンパイラは、タイプを選択するために異なるアルゴリズムを使用することができます(明示的に定義されたABIのような別の標準で指定されていない場合)。 (C++ 11は、新しい構文を使用して、基礎となる型を指定することを可能にする)

+0

必ずしもそうではありません。Cでは、答えに応じてC++を実行するのと同じように、列挙型の型をコンパイラが選択できるようにしています。 [the C standard](http://www.open-std.org/JTC1/sc22/wg14/www/docs/n1256.pdf)のセクション6.7.2.2/4を参照してください。 – pmg

+0

さらに、C++ 0xでは、新しい* enumクラス*を使用して、列挙値を戻すために使用される整数型を指定できます。 –

+0

@pmg、ありがとう。私はどこにいるのかわかりません。私はそれが既にC90のケースであることを確認した。 – AProgrammer

2

「それぞれの列挙型は、char、符号付き 整数型、または符号なし整数型と互換性がなければならない。タイプの選択は あります列挙のすべてのメンバーの の値を表すことができるものとします。

"...実装では、すべての列挙定数が表示されるまで、整数型 の選択が遅れることがあります。

ISO/IEC 9899:1999(E)するp.105

だから我々は唯一のsizeof(列挙型)の上限境界を持っています。ほとんどのシステムではsizeof(enum)= 4でしたが、STMコンパイラはsizeum(enum)= 1/2/4をenumで書かれた値に応じて作りました

編集:あなたのenumの値の1つをコンパイラが整数を列挙型サイズとして選択することを保証するための最大整数。

関連する問題