Enumeraties (enum) in de C-taal zijn een manier om een set van gehele naamgegeven constanten vast te stellen. Typische syntaxis:
enum Kleur { ROOD, GROEN, BLAUW };
Standaard krijgt de eerste waarde 0 toegewezen, en elke volgende waarde is de vorige + 1.
Voordelen van enumeraties:
enum als een zelfstandig type).Nadelen:
enum in de C-standaard heeft het type int (tot C99), waardoor er geen strikte typeveiligheid is.enum en int (geen controle op het bereik).enum MyType : unsigned char — maar dit is een uitbreiding).Voorbeeld:
enum Toestand { INIT = -1, LOPEND = 0, PAUZE = 1, STOP = 2 }; enum Toestand huidig = LOPEND;
Vraag: Is het veilig om waarden van verschillende enumeraties met elkaar te vergelijken?
Antwoord: Hoewel technische waarden van enum int zijn, is het ongewenst om variabelen van verschillende enumeraties met elkaar te vergelijken. Dit leidt tot verlies van semantiek en kan de lezer verwarren, en het kan in de toekomst het onderhoud van de code bemoeilijken. Het is beter om het type expliciet te converteren of de enumeraties logisch te groeperen.
Voorbeeld van een fout:
enum Fruit { APPLE, BANANA }; enum Dier { KAT, HOND }; if ((enum Fruit)BANANA == (enum Dier)KAT) { ... } // Logische fout
Geschiedenis
In het interprocessorprotocol werden berichten beperkt door #define met niet-unieke namen, wat leidde tot waardeconflicten bij het uitbreiden van het protocol. De vertaling naar enum maakte de controle van de gebruikte identificaties eenvoudiger en vereenvoudigde de debugging.
Geschiedenis
In een grote bibliotheek werd de status beheerd door strikte waarden int. Bij het refactoren vergaten ze alle define te synchroniseren met de nieuwe waarden. Het gebruik van enum voorkwam dit, maar één module bleef verouderde defines gebruiken, wat leidde tot moeilijk te identificeren fouten.
Geschiedenis
In het systeem voor het beheren van robotcomponenten had de ingenieur geen waarden voor het eerste element van de enum expliciet vastgesteld (alleen het tweede en derde werden gebruikt). Het programma werkte niet correct omdat het eerste element standaard een waarde van 0 had, wat conflicteerde met de logica van het uitwisselingsprotocol dat een andere waarde verwachtte.