Les énumérations (enum) en langage C sont un moyen de définir un ensemble de constantes entières nommées. La syntaxe typique :
enum Couleur { ROUGE, VERT, BLEU };
Par défaut, la première valeur reçoit 0, chaque valeur suivante reçoit la valeur précédente + 1.
Avantages des énumérations :
enum en tant que type autonome).Inconvénients :
enum dans la norme C a le type int (avant C99), donc il n'y a pas de sécurité stricte des types.enum et int (pas de contrôle de plage).enum MonType : unsigned char — mais c'est une extension).Exemple :
enum État { INIT = -1, EN_COURS = 0, PAUSE = 1, ARRÊTÉ = 2 }; enum État actuel = EN_COURS;
Question : Peut-on comparer en toute sécurité les valeurs de différentes énumérations entre elles ?
Réponse : Bien que techniquement les valeurs enum soient des int, il est indésirable de comparer des variables de différentes énumérations. Cela entraîne une perte de sémantique et peut embrouiller le lecteur, compliquant ainsi la maintenance du code à l'avenir. Il vaut mieux convertir explicitement le type ou regrouper logiquement les énumérations.
Exemple d'erreur :
enum Fruit { POMME, BANANE }; enum Animal { CHAT, CHIEN }; if ((enum Fruit)BANANE == (enum Animal)CHAT) { ... } // Erreur logique
Histoire
Dans le protocole de messages interprocesseurs, les #define avec des noms non uniques ont conduit à des collisions de valeurs lors de l'expansion du protocole. Le passage à enum a permis de simplifier le contrôle des identifiants utilisés et de faciliter le débogage.
Histoire
Dans une grande bibliothèque, la gestion des états était effectuée par des valeurs int rigides. Lors du refactoring, certains define ont été oubliés pour synchroniser avec les nouvelles valeurs. L'utilisation d'enum a permis de prévenir cela, mais un module continuait à utiliser des define obsolètes, provoquant des erreurs difficiles à détecter.
Histoire
Dans un système de contrôle de nœuds robotisés, l'ingénieur n'a pas spécifié explicitement les valeurs pour le premier élément de l'enum (seuls le deuxième et le troisième ont été utilisés). Le programme fonctionnait de manière incorrecte, car par défaut le premier élément avait la valeur 0, ce qui était en conflit avec la logique du protocole d'échange, qui attendait une autre valeur.