列挙値のセットを作成していますが、各列挙値は64ビット幅である必要があります。正しく思い出せば、enumは通常intと同じサイズです。しかし、(少なくともGCCでは)コンパイラは、値を保持するために必要な幅を列挙型にできると読んだと思いました。だから、64ビット幅の列挙を持つことは可能ですか?
enum
は、int
値を保持するのに十分な大きさであることが保証されています。コンパイラは、定義された列挙定数に基づいて使用される実際の型を自由に選択できるため、定義した値を表すことができる場合は、より小さい型を選択できます。 int
に収まらない列挙定数が必要な場合は、コンパイラー固有の拡張機能を使用する必要があります。
現在のC標準(C99)から引用: http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf
6.7.2.2列挙指定子
[...]
制約
列挙定数の値を定義する式は、intとして表現可能な値を持つ整数定数式でなければなりません。
[...]
各列挙型は、char、符号付き整数型、または符号なし整数型と互換性があります。タイプの選択は実装で定義されますが、列挙のすべてのメンバーの値を表すことができなければなりません。
コンパイラーは標準に従うのが得意ではありませんが、本質的には、enumがint以外のものを保持している場合、「1年か2年後にあなたに噛み付くかもしれない深いサポートされていない動作」になります。
C言語では、enum
のサイズはintであることが保証されています。短くするためのコンパイル時オプション(-fshort-enums
)があります(これは主に値が64K以下の場合に便利です)。サイズを64ビットに増やすためのコンパイル時オプションはありません。