本物のC

C の知識:列挙型


列挙型

列挙型とは、値の種類をリストによって指定できる型です。

enum 型名
{
定数名1,
定数名2,
...
};

これによりenum 型名という型ができると共に、定数名nenum 型名の定数として宣言されます。

列挙型の実体は何らかの整数型であり、列挙定数はある整数に置き換えられるマクロの様なものと言えます。それぞれの定数の値はデフォルトだと 0 から始まり 1 ずつ増えますが、指定することもできます。

enum io_type
{
ReadOnly = 1,
Writable = 4,
AppendWrite = 5
};

また只の整数型なので、列挙定数でないものを代入する事も可能ですが、それでは列挙型を使う意味がないので避けるべきでしょう。

列挙型の価値

列挙型はコードの可読性を向上させる為の機能であると言えます。例えば、ログファイルを開く関数であって

の 3 モードから何れかを選択できるものを作る場合、上の様なio_type(値はデフォルトでも何でもよい)を使えば

File openLog(char *name, io_type mode);

といった感じになり、modeのどの値がどのモードになるかは定数名から明らかです。

一方で列挙型を使わないならば、

File openLog(int id, int mode);

といった形になるでしょう。modeは単に整数型なので、三つの値しか取れない事やそれぞれの意味は全く伺えません。int等の整数型は数自体を表すもので(charは例外ですが)、数へ更に異なる意味を与えるのは混乱の元となります。

int
整数
恣意的
モード
列挙定数
―――→
自然言語での意味
モード

我々は既に自然言語という恣意性のプールを共有しているのですから、なるべくそれを再利用すべきです。(「恣意性」については「附録:恣意性」で説明しています。)