Defining symbolic names for constants in a program eases readability and simplifies the process of maintaining the program in the future. One method is to define an enumeration, which associates a set of integers with a set of identifiers called enumerators that the compiler recognizes and replaces with the corresponding integer value. An enumeration is defined using a declaration such as:
enum colors { RED, GREEN, BLUE };
The first enumerator in the enumeration, RED
, is assigned the value zero and each subsequent identifier is assigned the next integer value. You can also specify an explicit integer value for any enumerator by suffixing it with an equal sign and an integer constant, as in the following example:
enum colors { RED = 7, GREEN = 9, BLUE };
The enumerator BLUE
is assigned the value 10 by the compiler because it has no value specified and the previous enumerator is set to 9. Once an enumeration is defined, the enumerators can be used anywhere in a D program that an integer constant can be used. In addition, the enumeration enum colors
is also defined as a type that is equivalent to an int
. The D compiler will allow a variable of enum
type to be used anywhere an int
can be used, and will allow any integer value to be assigned to a variable of enum
type. You can also omit the enum
name in the declaration if the type name is not needed.
Enumerators are visible in all subsequent clauses and declarations in your program, so you cannot define the same enumerator identifier in more than one enumeration. However, you may define more than one enumerator that has the same value in either the same or different enumerations. You may also assign integers that have no corresponding enumerator to a variable of the enumeration type.
The D enumeration syntax is the same as the corresponding syntax in ANSI-C. D also provides access to enumerations defined in the operating system kernel and its loadable modules, but these enumerators are not globally visible in your D program. Kernel enumerators are only visible when used as an argument to one of the binary comparison operators when compared to an object of the corresponding enumeration type. For example, the function
uiomove
(
9F
)
has a parameter of type enum uio_rw
defined as follows:
enum uio_rw { UIO_READ, UIO_WRITE };
The enumerators UIO_READ
and UIO_WRITE
are not normally visible in your D program, but you can promote them to global visibility by comparing one a value of type enum uio_rw
, as shown in the following example clause:
fbt::uiomove:entry /args[2] == UIO_WRITE/ { ... }
This example traces calls to the
uiomove
(
9F
)
function for write requests by comparing args[2]
, a variable of type enum uio_rw
, to the enumerator UIO_WRITE
. Because the left-hand argument is an enumeration type, the D compiler searches the enumeration when attempting to resolve the right-hand identifier. This feature protects your D programs against inadvertent identifier name conflicts with the large collection of enumerations defined in the operating system kernel.