Handbuch zur dynamischen Ablaufverfolgung in Solaris

Aufzählungen

Indem Sie symbolische Namen für Konstanten definieren, verbessern Sie nicht nur die Lesbarkeit der Programme, sondern erleichtern auch die zukünftige Programmpflege. Ein mögliches Verfahren besteht in der Definition einer Aufzählung, die eine Menge von Ganzzahlen einem Satz Bezeichnern, den so genannten Aufzählungskonstanten, zuordnen. Diese erkennt der Compiler und ersetzt sie durch die entsprechenden ganzzahligen Werte. Aufzählungen werden mit Deklarationen wie der folgenden definiert:

enum colors {
	RED,
	GREEN,
	BLUE
};

Die erste Aufzählungskonstante in der Aufzählung, ROT, erhält den Wert Null, und jeder nachfolgende Bezeichner den nächsthöheren ganzzahligen Wert. Sie können für jede beliebige Aufzählungskonstante auch einen expliziten ganzzahligen Wert angeben, indem Sie ihr ein Gleichheitszeichen und eine ganzzahlige Konstante nachstellen:

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

Der Aufzählungskonstante BLAU wird vom Compiler der Wert 10 zugewiesen, da für sie kein Wert angegeben ist und die vorhergehende Aufzählungskonstante den Wert 9 besitzt. Nachdem eine Aufzählung definiert wurde, können deren Auszählungskonstanten überall dort in einem D-Programm verwendet werden, wo ganzzahlige Konstanten zum Einsatz kommen. Die Aufzählung enum colors ist außerdem als Typ int definiert. Der D-Compiler lässt Variablen des Typs enum überall dort zu, wo ein int verwendet werden kann. Einer Variable des Typs enum darf jeder ganzzahlige Wert zugewiesen werden. Wenn der Typname nicht erforderlich ist, können Sie in der Deklaration auf den Namen enum verzichten.

Aufzählungskonstanten sind in allen nachfolgenden Klauseln und Deklarationen eines Programms sichtbar. Deshalb kann ein Name für eine Aufzählungskonstante nicht in mehreren Aufzählungen definiert werden. Sie können allerdings sowohl in derselben als auch in verschiedenen Aufzählungen mehrere Aufzählungskonstanten mit demselben Wert definieren. Es ist auch möglich, einer Variable des Aufzählungstyps Ganzzahlen ohne entsprechende Aufzählungskonstante zuzuweisen.

Die Syntax für D-Aufzählungen ist identisch mit der entsprechenden Syntax in ANSI-C. D ermöglicht auch den Zugriff auf Aufzählungen, die im Betriebssystemkern und dessen ladbaren Modulen definiert sind. Diese Aufzählungskonstanten sind im D-Programm jedoch nicht global sichtbar. Kernel-Aufzählungskonstanten sind nur dann sichtbar, wenn sie zum Vergleich mit einem Objekt des entsprechenden Aufzählungstyps als Argument für einen binären Vergleichsoperator eingesetzt werden. So besitzt beispielsweise die Funktion uiomove(9F) einen Parameter des Typs enum uio_rw, der wie folgt definiert ist:

enum uio_rw { UIO_READ, UIO_WRITE };

Die Aufzählungskonstanten UIO_READ und UIO_WRITE sind in einem D-Programm normalerweise nicht sichtbar, können aber durch Vergleich mit einem Wert des Typs enum uio_rw auf globale Sichtbarkeit erweitert werden. Dies zeigt die nächste Beispielklausel:

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

In diesem Beispiel werden Aufrufe der Funktion uiomove(9F) für Schreibanforderungen verfolgt. Dabei wird args[2], eine Variable des Typs enum uio_rw, mit der Aufzählungskonstante UIO_WRITE verglichen. Da das Argument auf der linken Seite den Aufzählungstyp besitzt, durchsucht der D-Compiler die Aufzählung in dem Versuch, den Bezeichner auf der rechten Seite aufzulösen. Diese Einrichtung schützt Ihre D-Programme vor Namenskonflikten mit der umfangreichen Sammlung der im Betriebssystemkernel definierten Aufzählungen.