GNT sans publicité, site mobile, fonctionnalitées exclusives...

Variable de type enumeration

Le
candide
Bonjour,

La norme C90 dit

8<
Each enumerated type shall be compatible with an integer type; the
choice of type is implementation-defined.
>8

Ce qui n'est pas très clair c'est que par ailleurs :

8<
An identifier declared as an enumeration constant has type int.
>8

Je me pose donc la question de savoir si on peut utiliser sans risque
une variable de type énumération exactement comme s'il s'agissait d'une
variable de type int ? Je dis "sans risque" parce que formellement, je
crois que rien ne m'en empêche :

8<
A char, a short int, or an int bit-field, or their signed or
unsigned varieties, or an object that has enumeration type, may be
used in an expression wherever an int or unsigned int may be used.
>8

Si, par exemple

enum toto {A4, BQ} t;

peut-on écrire

t(;

(cela pourrait poser problème si l'on considère que les valeurs prises
par une variable de type enum toto sont parmi 34 et 51, cf. ma première
citation de la norme) ? Bon, en fait j'imagine que ça ne pose pas de
problème particulier mais je trouve que la norme n'est pas formelle sur
ce point. Par contre, pourrait-il y avoir des problèmes si on écrivait

t=-5;

?

Quelles précautions particulières prendre avec des variables de type
énumération ? Harbison & Steele recommandent une certaine prudence :


8<
We suggest that programmers treat enumerated types as different from
integers and not mix them in integer expressions without using casts.
>8

mais ils ne donnent aucun exemple illustrant les précautions à prendre.
Concrètement faut faire quoi ? Ainsi dans mon premier exemple ci-dessus,
dois-je écrire

t=(enum toto) 28;

?

Merci.
Lire les 63 réponses

Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 13
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
candide
Le #11179061
candide a écrit :


enum toto {A4, BQ} t;

peut-on écrire

t(;

(cela pourrait poser problème si l'on considère que les valeurs prises
par une variable de type enum toto sont parmi 34 et 51,





K&R2 répond à ma question :


---------------------- 8< --------------------------------------------
Although variables of enum types may be declared, compilers need not
check that what you store in such a variable is a valid value for the
enumeration.
---------------------- >8 --------------------------------------------

(bien que la formulation soit encore assez imprécise).
Thierry B.
Le #11184711
--{ candide a plopé ceci: }--

enum toto {A4, BQ} t;
peut-on écrire
t(;




Ayant la vilaine habitude d'écrire du code crade, puis-je me
permettre de dire que "ça", je ne le ferais jamais ?

Même la programmation de goret doit avoir ses limites, non ?


--
Bonaventure Pochard :
Je cherche un bon jeu de poker pour PC ( de préférence gratuit). Que me
conseillez-vous ?


Bon sang Pochard, qu'est ce que vous avez encore inventé comme AAD ?


Wykaaa
Le #11190701
candide a écrit :
Bonjour,

La norme C90 dit

--------------------------- 8< ------------------------------------
Each enumerated type shall be compatible with an integer type; the
choice of type is implementation-defined.
--------------------------- >8 ------------------------------------

Ce qui n'est pas très clair c'est que par ailleurs :

--------------------------- 8< ------------------------------------
An identifier declared as an enumeration constant has type int.
--------------------------- >8 ------------------------------------

Je me pose donc la question de savoir si on peut utiliser sans risque
une variable de type énumération exactement comme s'il s'agissait d'une
variable de type int ? Je dis "sans risque" parce que formellement, je
crois que rien ne m'en empêche :

--------------------------- 8< ------------------------------------
A char, a short int, or an int bit-field, or their signed or
unsigned varieties, or an object that has enumeration type, may be
used in an expression wherever an int or unsigned int may be used.
--------------------------- >8 ------------------------------------

Si, par exemple

enum toto {A4, BQ} t;

peut-on écrire

t(;

(cela pourrait poser problème si l'on considère que les valeurs prises
par une variable de type enum toto sont parmi 34 et 51, cf. ma première
citation de la norme) ? Bon, en fait j'imagine que ça ne pose pas de
problème particulier mais je trouve que la norme n'est pas formelle sur
ce point. Par contre, pourrait-il y avoir des problèmes si on écrivait

t=-5;

?

Quelles précautions particulières prendre avec des variables de type
énumération ? Harbison & Steele recommandent une certaine prudence :


--------------------------- 8< ------------------------------------
We suggest that programmers treat enumerated types as different from
integers and not mix them in integer expressions without using casts.
--------------------------- >8 ------------------------------------

mais ils ne donnent aucun exemple illustrant les précautions à prendre.
Concrètement faut faire quoi ? Ainsi dans mon premier exemple ci-dessus,
dois-je écrire

t=(enum toto) 28;

?

Merci.


La dernière recommandation d'Harbison & Steele est tout à fait
pertinente et doit être suivie. De toute façon, le livre d'Harbison &
Steele est, à mon avis, le meilleur livre sur C.

J'ai une question, cependant, à propos de tes interrogations :
Pourquoi vouloir à tout prix "utiliser une variable de type enum
exactement comme une variable de type int" ?
Ou tes questions ne sont-elles là que pour illustrer que la norme n'est
pas très clair sur la frontière enum/int ?

Ou, autrement dit, pourquoi vouloir utiliser des enum comme des int ?
Dans ce cas, il vaut mieux ne pas utiliser d'enum.

J'ai fait un compilo C et dans lequel les enum étaient effectivement
implémentés comme des int mais ce n'est pas une raison pour les traiter
comme tels.

Par ailleurs, le langage C est très laxiste sur les conversions implicites.
J'ai une règle de programmation intangible (que je respecte toujours) :
j'explicite toujours les conversions même dans les langages qui
admettent des conversions implicites. Cette habitude me vient du langage
ADA qui n'admet AUCUNE conversion implicite (même de entier vers flottant).
De cette façon, j'ai beaucoup moins de "surprises" que mes collègues.
candide
Le #11200751
Wykaaa a écrit :

pertinente et doit être suivie. De toute façon, le livre d'Harbison &
Steele est, à mon avis, le meilleur livre sur C.



Voilà donc qui n'est pas très flatteur pour la littérature sur le C.


Pourquoi vouloir à tout prix "utiliser une variable de type enum
exactement comme une variable de type int" ?
Ou tes questions ne sont-elles là que pour illustrer que la norme n'est
pas très clair sur la frontière enum/int ?



Je voulais éclaicir les conséquences de ce que dit la norme et aussi
connaître la façon reconnue d'utiliser des variables de type enum.
espie
Le #11200821
In article candide
Wykaaa a écrit :

pertinente et doit être suivie. De toute façon, le livre d'Harbison &
Steele est, à mon avis, le meilleur livre sur C.



Voilà donc qui n'est pas très flatteur pour la littérature sur le C.



Je ne vois pas de lien logique. Dire qu'un bouquin est `le meilleur sur
le langage' ne veut pas dire que les autres soient mauvais. Ou alors,
tu n'aimes pas Harbison & Steele ?

Manque de bol, sur un axe tres precis, c'est effectivement un des meilleurs
bouquins existants: c'est un tres bon ouvrage de reference vis-a-vis du
langage. Forcement moins exact que la norme, par construction, mais egalement
sensiblement plus digeste.

Je ne l'ai jamais pris en defaut jusqu'ici.

Par contre, ca n'est clairement pas un bouquin d'apprentissage du C.
Mais, sur ce plan, je ne sais pas s'il existe grand chose de correct en
dehors du K&R (qui est fort bien, mais quelque peu limite parfois)...
les autres bouquins auxquels j'ai jete un oeil sont le plus souvent
largement pires (en particulier, remplis d'erreurs et d'inexactitudes).
Publicité
Suivre les réponses
Poster une réponse
Anonyme