Le enumerazioni (enum) nel linguaggio C sono un modo per definire un insieme di costanti numeriche con nome. La sintassi tipica è:
enum Color { RED, GREEN, BLUE };
Per impostazione predefinita, il primo valore è assegnato a 0, e ciascun valore successivo ottiene il valore precedente + 1.
Vantaggi delle enumerazioni:
enum come tipo autonomo).Svantaggi:
enum nello standard C ha tipo int (fino a C99), quindi non c'è una rigorosa sicurezza dei tipi.enum e int (nessun controllo sul range).enum MyType : unsigned char — ma questa è un'estensione).Esempio:
enum State { INIT = -1, RUNNING = 0, PAUSED = 1, STOPPED = 2 }; enum State current = RUNNING;
Domanda: È possibile confrontare in modo sicuro i valori di diverse enumerazioni tra loro?
Risposta: Anche se tecnicamente i valori di enum sono int, confrontare variabili di diverse enumerazioni non è consigliabile. Questo porta a una perdita di semantica e può confondere chi legge, oltre a complicare in futuro il supporto del codice. È meglio convertire esplicitamente il tipo o raggruppare logicamente le enumerazioni.
Esempio di errore:
enum Fruit { APPLE, BANANA }; enum Animal { CAT, DOG }; if ((enum Fruit)BANANA == (enum Animal)CAT) { ... } // Errore logico
Storia
Nel protocollo di messaggi interprocesso, si utilizzavano #define con nomi non univoci, portando a collisioni di valori durante l'espansione del protocollo. La traduzione in enum ha semplificato il controllo degli identificatori utilizzati e il debug.
Storia
In una grande libreria, l'elaborazione degli stati avveniva tramite valori interi rigidi. Durante il refactoring, si è dimenticato di sincronizzare tutti i define con i nuovi valori. L'uso di enum ha permesso di prevenire ciò, ma un modulo continuava a utilizzare definizioni obsolete, causando errori difficili da individuare.
Storia
Nel sistema di gestione dei nodi robotici, un ingegnere non ha specificato esplicitamente i valori per il primo elemento enum (sono stati utilizzati solo il secondo e il terzo). Il programma non funzionava correttamente, poiché per impostazione predefinita il primo elemento aveva valore 0, in conflitto con la logica del protocollo di scambio, che si aspettava un altro valore.