© Éditions Eyrolles
179
chapitre n° 9
Les structures et les énumérations
c = drapeau ; /* OK bien que drapeau et c ne soit pas d’un même type */
drapeau = 3 * c + 4 ;
/* accepté */
Les constantes d’un type énumération peuvent être quelconques
Dans les exemples précédents, les valeurs des constantes attribuées aux identificateurs apparaissant dans un type énumération étaient déterminées automatiquement par le compilateur.
Mais il est possible d’influer plus ou moins sur ces valeurs, comme dans :
enum couleur_bis { jaune = 5, rouge, bleu, vert = 12, rose } ;
/* jaune = 5, rouge = 6, bleu = 7, vert = 12, rose = 13 */
Les entiers négatifs sont permis comme dans :
enum couleur_ter { jaune = -5, rouge, bleu, vert = 12 , rose } ;
/* jaune = -5, rouge = -4, bleu = -3, vert = 12, rose = 13 */
En outre, rien n’interdit qu’une même valeur puisse être attribuée à deux identificateurs
différents :
enum couleur_ter { jaune = 5, rouge, bleu, vert = 6, noir, violet } ;
/* jaune = 5, rouge = 6, bleu = 7, vert = 6, noir = 7, violet = 8 */
Comme dans le cas des structures ou des unions, on peut mixer la définition d’un type énuméré et la déclaration de variables utilisant le type. Par exemple, ces deux instructions :
enum couleur {jaune, rouge, bleu, vert} ;
enum couleur c1, c2 ;
peuvent être remplacées par :
enum couleur {jaune, rouge, bleu, vert} c1, c2 ;
Dans ce cas, on peut même utiliser un type anonyme, en éliminant l’identificateur de type :
enum {jaune, rouge, bleu, vert} c1, c2 ;
Cette dernière possibilité présente moins d’inconvénients que dans le cas des structures ou
des unions, car aucun problème de compatibilité de type ne risque de se poser.
Compte tenu de la manière dont sont utilisées les structures, il était permis de donner deux noms
identiques à des champs de structures différentes. En revanche, une telle possibilité ne peut plus
s’appliquer à des identificateurs définis dans une instruction enum. Considérez cet exemple :
enum couleur {jaune, rouge, bleu, vert} ;
enum bois_carte { rouge, noir } ; /* erreur : rouge déjà défini */
int rouge ;
/* erreur : rouge déjà défini */
Bien entendu, la portée de tels identificateurs est celle correspondant à leur déclaration (fonction
ou partie du fichier source suivant cette déclaration).
Delannoy Livre.book Page 179 Mercredi, 6. mai 2009 4:26 16
Précédent

- 192/281

Suivant