12.3    Der Aufzählungstyp enum

Mit der enum-Aufzählung können Sie Namen für ganzzahlige Datentypen definieren, die Sie dann mit diesen Namen verwenden. Genau genommen sind Aufzählungstypen nichts anderes als Konstanten, weshalb diese häufig auch Aufzählungskonstanten genannt werden. Ein einfaches Beispiel wäre z. B.:

enum religion { rk, evang, islam, bud, sonstige };

Hier wird ein neuer Datentyp religion mit den Aufzählungskonstanten rk (für römisch-katholisch) evang (für evangelisch), islam, bud (für buddhistisch) und sonstige definiert. Alle Aufzählungskonstanten sind vom Datentyp int und können überall dort eingesetzt werden, wo auch ein int verwendet wird. Solche Aufzählungskonstanten werden gerne bei den case-Konstanten innerhalb einer switch-Anweisung verwendet.

Manche Compiler verlangen – wie auch bei den Structs – ein typedef vor enum und den Typnamen am Ende der Definition. Deshalb sieht man z. B. in vielen Programmen oft folgende oder ähnliche Definition:

typedef enum {false,true} bool;

Intern beginnen enum-Werte mit der ersten Aufzählungskonstanten 0, wenn nicht anders vorgegeben, und werden jeweils um den Wert 1 gegenüber dem Vorgänger erhöht, wenn auch hier nichts anderes vorgegeben ist. Somit ist in dem Beispiel mit den Religionen der Wert der Aufzählungskonstante rk gleich 0, evang gleich 1, islam gleich 2, bud gleich 3 und sonstige gleich dem Wert 4. Deshalb wird im Beispiel mit dem bool auch 0 mit false und 1 mit true gleichgesetzt. Verwenden Sie enum hingegen wie folgt:

enum religion { rk=1, evang, islam, bud=24, sonstige };

dann hat die Aufzählungskonstante rk den Wert 1, evang ist gleich 2, und islam ist 3. Der Wert für bud lautet jetzt 24, und für sonstige erhöht sich der Wert ebenfalls wieder um 1 vom Vorgänger. Er ist somit automatisch 25.

Es spricht nichts dagegen, in einer enum mehrere Konstanten mit demselben Wert zu definieren. Hier ein Beispiel:

enum zustand { READ, WRITE, LESEN=0, SCHREIBEN=1 };

Hier haben READ und LESEN jeweils den Wert 0, WRITE und SCHREIBEN den Wert 1.

Sicher fragen Sie sich jetzt, welchen Vorteil es hat, den Aufzählungstyp

enum wochentag{ MO=1, DI, MI, DO, FR, SA, SO };

statt #define zu verwenden, z. B. im Sinne der folgenden Definition:

#define MO 1
#define DI 2
#define MI 3
#define DO 4
...

Beide Varianten lassen sich äquivalent in einem Programm verwenden. Der Vorteil der enum-Variante liegt darin, dass enum-Werte im Debugger symbolisch dargestellt werden können, vorausgesetzt, Sie haben einen Bezeichner bzw. Namen für die enum-Aufzählung verwendet.

enum kann innerhalb eines Geltungsbereichs als Deklaration wie folgt verwendet werden:

enum wochentag tag1 = MO, tag2 = FR;
// Oder in einer Funktion:
void setDate( enum wochentag tag );