在程序中为常量定义符号名称,会增强程序的可读性,并使将来对程序的维护变得简单明了。一种方法是定义枚举,即,将一组整数与一组称为枚举器的标识符进行关联,编译器可以识别这些枚举器并将其替换为相应的整数值。使用如下所示的声明定义枚举:
enum colors { RED, GREEN, BLUE };
枚举中的第一个枚举器 RED 被赋予的值为零,每个后续标识符被赋予下一个整数值。您也可以通过在任何枚举器的后面加上等号和整型常数,来为该枚举器指定显式的整数值。
enum colors { RED = 7, GREEN = 9, BLUE };
由于枚举器 BLUE 没有指定值,且前一个枚举器设置为 9,所以编译器将为其赋予值 10。定义枚举之后,D 程序中可以使用整型常数的任何位置都可以使用该枚举器。此外,enum colors 还定义为与 int 等效的类型。D 编译器允许在可以使用 int 的任何位置使用 enum 类型的变量,并允许将任何整数值赋给 enum 类型的变量。如果不需要类型名称,也可以在声明中省略 enum 名称。
枚举器在程序的所有后续子句和声明中都可见,因此不能在多个枚举中定义相同的枚举器标识符。但是,您可以在相同或不同的枚举中定义具有相同值的多个枚举器。您也可以将没有相应枚举器的整数赋给枚举类型的变量。
D 枚举语法与 ANSI-C 中相应的语法相同。D 还可以访问操作系统内核及其可装入的模块中定义的枚举,但这些枚举器在 D 程序中并不全局可见。内核枚举器仅当与相应枚举类型的某个对象比较、并用作某个二元比较运算符的参数时可见。例如,函数 uiomove(9F) 具有如下所定义的 enum uio_rw 类型的参数:
enum uio_rw { UIO_READ, UIO_WRITE };
枚举器 UIO_READ 和 UIO_WRITE 通常在 D 程序中不可见,但可以通过与 enum uio_rw 类型的值进行比较,将这两种枚举器提升为全局可见,如以下示例子句中所示:
fbt::uiomove:entry /args[2] == UIO_WRITE/ { ... }
此示例通过将 args[2](enum uio_rw 类型的变量)与枚举器 UIO_WRITE 进行比较,来跟踪写入请求对 uiomove(9F) 函数的调用。因为左边的参数为枚举类型,D 编译器将在尝试解析右边的标识符时,在该枚举中进行搜索。此功能可以避免 D 程序无意中与操作系统内核中定义的大枚举集合产生标识符名称冲突。