Enumerations
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 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.