Cの列挙型のサイズは?

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


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

コンパイラが標準に従うのが得意というわけではありませんが、本質的には:列挙型が int 以外のものを保持している場合、「サポートされていない動作が 1 年か 2 年後に戻ってくる可能性がある」領域に陥っています。

更新:C 標準 (C11) の公開されている最新のドラフト:http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1570.pdf には、同じ条項が含まれています。したがって、この答えは C11 にも当てはまります。


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

GCC での例 (GCC マニュアルのドキュメント):

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