Aufzählungen (enum) in der Programmiersprache C sind eine Möglichkeit, eine Menge von ganzzahligen benannten Konstanten zu definieren. Der typische Syntax lautet:
enum Color { RED, GREEN, BLUE };
Standardmäßig wird dem ersten Wert 0 zugewiesen, jedem nachfolgenden Wert der vorherige + 1.
Vorteile von Aufzählungen:
enum wird als eigenständiger Typ verwendet).Nachteile:
enum im C-Standard hat den Typ int (bis C99), daher gibt es keine strikte Typensicherheit.enum und int (keine Bereichskontrolle).enum MyType : unsigned char — dies ist jedoch eine Erweiterung).Beispiel:
enum State { INIT = -1, RUNNING = 0, PAUSED = 1, STOPPED = 2 }; enum State current = RUNNING;
Frage: Kann man die Werte verschiedener Aufzählungen sicher miteinander vergleichen?
Antwort: Obwohl die Werte von enum technisch int sind, ist es unerwünscht, Variablen verschiedener Aufzählungen zu vergleichen. Dies führt zu Verlust der Semantik und kann den Leser verwirren sowie zukünftig die Wartung des Codes erschweren. Es ist besser, den Typ explizit zu konvertieren oder die Aufzählungen logisch neu zu gruppieren.
Beispiel eines Fehlers:
enum Fruit { APPLE, BANANA }; enum Animal { CAT, DOG }; if ((enum Fruit)BANANA == (enum Animal)CAT) { ... } // Logischer Fehler
Geschichte
In einem interprozessualen Nachrichtenprotokoll wurden #define mit nicht eindeutigen Namen verwendet, was zu Wertkonflikten bei der Erweiterung des Protokolls führte. Der Wechsel zu enum ermöglichte es, die Kontrolle über die verwendeten Identifikatoren zu vereinfachen und das Debugging zu erleichtern.
Geschichte
In einer großen Bibliothek wurde der Zustand mit festen int-Werten behandelt. Bei der Refaktorisierung wurde vergessen, alle defines auf die neuen Werte zu synchronisieren. Die Verwendung von enum konnte dies verhindern, aber ein Modul verwendete weiterhin veraltete defines, was zu schwer erkennbaren Fehlern führte.
Geschichte
In einem Steuerungssystem für robotische Einheiten gab der Ingenieur den Werten für das erste Element von enum (insgesamt wurden nur das zweite und dritte verwendet) nicht ausdrücklich an. Das Programm funktionierte fehlerhaft, weil das erste Element standardmäßig den Wert 0 hatte, was mit der Logik des Austauschprotokolls, das einen anderen Wert erwartete, in Konflikt stand.