Enumeracje (enum) w języku C to sposób na zdefiniowanie zbioru nazwanych stałych całkowitych. Typowa składnia:
enum Color { RED, GREEN, BLUE };
Domyślnie pierwszej wartości przypisywana jest 0, każda następna to poprzednia + 1.
Zalety enumeracji:
enum jako samodzielnego typu).Wady:
enum w standardzie C ma typ int (do C99), dlatego nie ma ścisłej bezpieczeństwa typów.enum a int (brak kontroli zakresu).enum MyType : unsigned char — ale to rozszerzenie).Przykład:
enum State { INIT = -1, RUNNING = 0, PAUSED = 1, STOPPED = 2 }; enum State current = RUNNING;
Pytanie: Czy można bezpiecznie porównywać wartości różnych enumeracji ze sobą?
Odpowiedź: Mimo że technicznie wartości enum to int, porównywanie zmiennych różnych enumeracji jest niepożądane. Prowadzi to do utraty semantyki i może wprowadzać w błąd czytającego, a także w przyszłości utrudniać utrzymanie kodu. Lepiej jawnie przekonwertować typ lub logicznie pogrupować enumeracje.
Przykład błędu:
enum Fruit { APPLE, BANANA }; enum Animal { CAT, DOG }; if ((enum Fruit)BANANA == (enum Animal)CAT) { ... } // Błąd logiczny
Historia
W protokole komunikacyjnym międzyprocesowym ograniczono użycie #define z nieunikalnymi nazwami, co doprowadziło do kolizji wartości przy rozbudowie protokołu. Przejście na enum uprościło kontrolę używanych identyfikatorów i ułatwiło debugowanie.
Historia
W dużej bibliotece obróbka stanu była realizowana na podstawie sztywnych wartości int. Podczas refaktoryzacji zapomniano zsynchronizować wszystkie define do nowych wartości. Użycie enum pozwoliło to zapobiec, ale jeden moduł nadal korzystał ze starych define, powodując trudne do wykrycia błędy.
Historia
W systemie sterowania robotycznymi węzłami inżynier nie przypisał jawnie wartości dla pierwszego elementu enum (wykorzystany został tylko drugi i trzeci). Program działał niepoprawnie, ponieważ domyślnie pierwszy element miał wartość 0, co kolidowało z logiką protokołu wymiany, oczekującą innej wartości.