web-dev-qa-db-ja.com

Cの列挙型のサイズは?

列挙値のセットを作成していますが、各列挙値は64ビット幅である必要があります。正しく思い出せば、enumは通常intと同じサイズです。しかし、(少なくともGCCでは)コンパイラは、値を保持するために必要な幅を列挙型にできると読んだと思いました。だから、64ビット幅の列挙を持つことは可能ですか?

135
mipadi

enumは、int値を保持するのに十分な大きさであることが保証されています。コンパイラは、定義された列挙定数に基づいて使用される実際の型を自由に選択できるため、定義した値を表すことができる場合は、より小さい型を選択できます。 intに収まらない列挙定数が必要な場合は、コンパイラー固有の拡張機能を使用する必要があります。

95
Robert Gamble

現在のC標準(C99)から引用: http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf

6.7.2.2列挙指定子
[...]
制約
列挙定数の値を定義する式は、intとして表現可能な値を持つ整数定数式でなければなりません。
[...]
各列挙型は、char、符号付き整数型、または符号なし整数型と互換性があります。タイプの選択は実装で定義されますが、列挙のすべてのメンバーの値を表すことができなければなりません。

コンパイラーは標準に従うのが得意ではありませんが、本質的には、enumがint以外のものを保持している場合、「1年か2年後にあなたに噛み付くかもしれない深いサポートされていない動作」になります。

90
Michael Stum

前の答えは正しいですが、一部のコンパイラには、標準を破り、すべての値を含む最小の型を使用するオプションがあります。

GCCGCCマニュアル )のドキュメントの例:

enum ord {
    FIRST = 1,
    SECOND,
    THIRD
} __attribute__ ((__packed__));
STATIC_ASSERT( sizeof(enum ord) == 1 )
13
Kevin Cox

C言語では、enumのサイズはintであることが保証されています。短くするためのコンパイル時オプション(-fshort-enums)があります(これは主に値が64K以下の場合に便利です)。サイズを64ビットに増やすためのコンパイル時オプションはありません。

0
rashok