列挙体は、名前付き整数定数のセットで構成されます。 列挙型宣言では、(省略可能) 列挙タグの名前を指定します。 また、名前付き整数識別子のセット (列挙セット、列挙子定数、列挙子、またはメンバーと呼ばれます) を定義します。 列挙型の変数には、その型によって定義された列挙セットのいずれかの値が格納されます。
enum型の変数は、式のインデックス作成や、すべての算術演算子と関係演算子のオペランドとして使用できます。 列挙型は、 #define プリプロセッサ ディレクティブの代わりに、値を自動的に生成し、通常のスコープ規則に従うことができるという利点を提供します。
ANSI C では、列挙子定数の値を定義する式は常に int 型を持っています。 つまり、列挙変数に関連付けられているストレージは、単一の int 値に必要なストレージです。 列挙定数または列挙型の値は、C 言語で整数式が許可されている任意の場所で使用できます。
構文
enum-specifier:
enum
identifier
選ぶ{enumerator-list}
enum
identifier
enumerator-list:
enumerator
enumerator-list
,
enumerator
enumerator:
enumeration-constant
enumeration-constant
=
constant-expression
enumeration-constant:
identifier
省略可能な identifier は、 enumerator-listによって定義された列挙型に名前を付けます。 この識別子は、多くの場合、リストで指定された列挙体の "タグ" と呼ばれます。 次に示すように、型指定子は、 identifier を非終端 enumerator-list 指定された列挙体のタグとして宣言します。
enum identifier
{
// enumerator-list
}
enumerator-listは、列挙セットのメンバーを定義します。
タグの宣言が表示される場合は、タグを使用するが省略する後の宣言 enumerator-list 、以前に宣言された列挙型を指定します。 タグは定義された列挙型を参照する必要があり、その列挙型は現在のスコープ内にある必要があります。 列挙型は他の場所で定義されているため、この宣言では enumerator-list は表示されません。 列挙型から派生した型の宣言と列挙型の typedef 宣言では、列挙型が定義される前に列挙タグを使用できます。
enumerator-list内の各enumeration-constantは、列挙セットの値に名前を付けます。 既定では、最初の enumeration-constant は値 0 に関連付けられます。 リスト内の次の enumeration-constant は、明示的に別の値に関連付ける場合を除き、( constant-expression + 1) の値に関連付けられます。
enumeration-constantの名前は、その値と同じです。
enumeration-constant
=
constant-expressionを使用して、値の既定のシーケンスをオーバーライドできます。 つまり、 enumeration-constant = constant-expression が enumerator-listに表示される場合、 enumeration-constant は constant-expressionによって指定された値に関連付けられます。
constant-expressionにはint型が必要であり、負の値を指定できます。
列挙セットのメンバーには、次の規則が適用されます。
列挙セットには、重複する定数値を含めることができます。 たとえば、値 0 を 2 つの異なる識別子 (
nullおよびzeroという名前のメンバーなど) と同じセットに関連付けることができます。列挙リスト内の識別子は、同じ可視性を持つ同じスコープ内の他の識別子とは異なる必要があります。 これには、他の列挙リストの通常の変数名と識別子が含まれます。
列挙タグは、通常のスコープ規則に従います。 これらは、同じ可視性を持つ他の列挙、構造体、および共用体タグとは異なる必要があります。
例示
次の例は、列挙宣言を示しています。
enum DAY /* Defines an enumeration type */
{
saturday, /* Names day and declares a */
sunday = 0, /* variable named workday with */
monday, /* that type */
tuesday,
wednesday, /* wednesday is associated with 3 */
thursday,
friday
} workday;
値 0 は既定で saturday に関連付けられています。
sunday識別子は明示的に 0 に設定されています。 残りの識別子には、既定で 1 ~ 5 の値が指定されます。
この例では、セット DAY の値が変数 todayに割り当てられます。
enum DAY today = wednesday;
列挙定数の名前は、値の割り当てに使用されます。
DAY列挙型は以前に宣言されているため、必要なのは列挙タグDAYだけです。
列挙型の変数に整数値を明示的に割り当てるには、型キャストを使用します。
workday = ( enum DAY ) ( day_value - 1 );
このキャストは C で推奨されますが、必須ではありません。
enum BOOLEAN /* Declares an enumeration data type called BOOLEAN */
{
false, /* false = 0, true = 1 */
true
};
enum BOOLEAN end_flag, match_flag; /* Two variables of type BOOLEAN */
この宣言は、次のように指定することもできます。
enum BOOLEAN { false, true } end_flag, match_flag;
または as
enum BOOLEAN { false, true } end_flag;
enum BOOLEAN match_flag;
これらの変数を使用する例は次のようになります。
if ( match_flag == false )
{
.
. /* statement */
.
}
end_flag = true;
名前のない列挙子のデータ型を宣言することもできます。 データ型の名前は省略されますが、変数は宣言できます。 変数 response は、定義された型の変数です。
enum { yes, no } response;