Solaris 動的トレースガイド

列挙

プログラム内の定数の記号名を定義すると、読みやすく、将来的に管理しやすいプログラムになります。このためには、「列挙」を定義します。列挙は、一連の整数と、「列挙子」と呼ばれる一連の識別子を関連付けます。コンパイラは、この列挙子を認識し、その位置に対応する整数値を代入します。列挙の定義には、次のような宣言を使用します。

enum colors {
	RED,
	GREEN,
	BLUE
};

この列挙の最初の列挙子 RED には値ゼロ、以降の列挙子には、前の列挙子に割り当てられた値の次の整数値が割り当てられます。各列挙子に明示的に整数値を指定することもできます。この場合は、次の例のように、列挙子と整数定数を等号で結びます。

enum colors {
	RED = 7,
	GREEN = 9,
	BLUE
};

列挙子 BLUE には値が指定されていませんが、前の列挙子が 9 に設定されているので、コンパイラによって値 10 が割り当てられます。列挙の定義後は、D プログラム内のどこでも整数定数と同じように列挙子を使用できます。列挙 enum colors は、int と同等の型としても定義されています。enum 型の変数は、int 型と同じように使用できます。また、enum 型の変数には、任意の整数値を割り当てることができます。また、型名が不要なときは、宣言内で enum 名を省略できます。

列挙子は、プログラム内の以降のすべての節、すべての宣言で使用できます。そのため、複数の列挙で同じ列挙子を定義することはできません。ただし、1 つの列挙、または複数の列挙内に、同じ値を持つ列挙子を複数個定義することは問題ありません。列挙型の変数に、対応する列挙子を持たない整数を割り当てることもできます。

D の列挙の構文は、ANSI-C の場合と同じです。D でも、オペレーティングシステムカーネルやそのロード可能なモジュールに定義された列挙にアクセスできます。ただし、これらの列挙の列挙子は、D プログラム全体で使用可能であるわけではありません。カーネル列挙子が使用可能であるのは、二項比較演算子を使って対応する列挙型のオブジェクトとの比較を行う際、その比較演算子の引数として指定された場合にかぎられます。たとえば、関数 uiomove(9F) は、次のように定義された enum uio_rw 型のパラメータを持ちます。

enum uio_rw { UIO_READ, UIO_WRITE };

列挙子 UIO_READUIO_WRITE は、通常、D プログラム内で使用可能ではありません。enum uio_rw 型の値の比較を行うことによって列挙子を拡張すれば、使用可能になります。次の例を参照してください。

fbt::uiomove:entry
/args[2] == UIO_WRITE/
{
	...
}

この例では、enum uio_rw 型の変数 args[2] と列挙子 UIO_WRITE の比較によって、書き込み要求の uiomove(9F) 関数呼び出しがトレースされます。左側の引数は列挙型なので、D コンパイラは、右側の識別子を解決する際、列挙を検索します。オペレーティングシステムカーネルには大量の列挙が定義されていますが、この機能を利用すれば、D プログラム内で重複した識別子名を誤って使用してしまうのを防ぐことができます。