列挙値のセットを作成していますが、各列挙値は64ビット幅である必要があります。私が正しく思い出せば、列挙型は一般的にintと同じサイズです。(少なくともGCCでは)コンパイラが値を保持するために必要な任意の幅を列挙型にできることをどこかで読んだと思いました。それで、64ビット幅の列挙型を持つことは可能ですか?
列挙値のセットを作成していますが、各列挙値は64ビット幅である必要があります。私が正しく思い出せば、列挙型は一般的にintと同じサイズです。(少なくともGCCでは)コンパイラが値を保持するために必要な任意の幅を列挙型にできることをどこかで読んだと思いました。それで、64ビット幅の列挙型を持つことは可能ですか?
回答:
enum
唯一のホールドに十分な大きさであることが保証されint
た値。コンパイラーは、定義された列挙定数に基づいて使用される実際のタイプを自由に選択できるため、ユーザーが定義した値を表すことができる場合は、より小さいタイプを選択できます。収まらない列挙定数が必要な場合は、int
コンパイラ固有の拡張機能を使用してこれを行う必要があります。
enum
より大きいint
か、小さいか @MichaelStumの回答に従うと、最初の文は「An enum
はint
値に収まることが保証されているだけ」になります。
enum
のみ列挙型で最大の列挙子の値を保持するのに十分な大きさであることが保証されます。
現在のC標準(C99)から取得:http : //www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf
6.7.2.2列挙指定子
[...]
制約
列挙定数の値を定義する式は、intとして表現可能な値を持つ整数定数式でなければなりません。
[...]
各列挙型は、char、符号付き整数型、または符号なし整数型と互換性があります。タイプの選択は実装定義ですが、列挙型のすべてのメンバーの値を表すことができます。
コンパイラーは標準に従うのが得意ではありませんが、基本的には次のとおりです。列挙型がint以外のものを保持している場合、「サポートされていない動作が1〜2年後に発生する可能性があります」という深い領域にいます。
int
short
long
int
、実際の列挙変数は別の型である可能性があります。これは、標準でよく知られている不整合です。
enum my_enum { my_value }
、my_value
種類を持っていますint
が、enum my_enum
少なくとも、すべての列挙値を表す必要があり、実装定義された型を持つことができます。したがってmy_value
、への変換が狭まる可能性がありますが、enum my_enum
オーバーフローしないことが保証されています。
以前の答えは正しいですが、一部のコンパイラには標準を破ってすべての値を含む最小の型を使用するオプションがあります。
enum ord {
FIRST = 1,
SECOND,
THIRD
} __attribute__ ((__packed__));
STATIC_ASSERT( sizeof(enum ord) == 1 )
このコードを考えてみましょう:
enum value{a,b,c,d,e,f,g,h,i,j,l,m,n};
value s;
cout << sizeof(s) << endl;
それは出力として4を与えます。したがって、要素の数に関係なくenum
、そのサイズは常に固定されます。