web-dev-qa-db-fra.com

Quelle est la taille d'une enum en C?

Je crée un ensemble de valeurs enum, mais j'ai besoin que chaque valeur enum ait une largeur de 64 bits. Si je me souviens bien, une énumération a généralement la même taille qu'un int; mais je pensais avoir lu quelque part que (du moins dans GCC) le compilateur pouvait donner à l’énum toute la largeur nécessaire pour conserver ses valeurs. Alors, est-il possible d'avoir un enum de 64 bits de large?

128
mipadi

Il est uniquement garanti que enum est suffisamment grand pour contenir les valeurs int. Le compilateur est libre de choisir le type réel utilisé en fonction des constantes d'énumération définies afin de pouvoir choisir un type plus petit s'il peut représenter les valeurs que vous définissez. Si vous avez besoin de constantes d’énumération qui ne rentrent pas dans une variable int, vous devrez utiliser des extensions spécifiques au compilateur.

90
Robert Gamble

Tiré de la norme C actuelle (C99): http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf

6.7.2.2 Spécificateurs d'énumération
[...]
Contraintes
L'expression qui définit la valeur d'une constante d'énumération doit être un entier expression constante qui a une valeur représentable en tant que int.
[...]
Chaque type énuméré doit être compatible avec char, un type entier signé ou un type entier non signé. Le choix du type est défini par l'implémentation, mais doit être capable de représenter les valeurs de tous les membres de l'énumération.

Non pas que les compilateurs soient bons à suivre la norme, mais essentiellement: si votre enum contient autre chose qu'un int, vous avez un comportement "non supporté" qui peut vous revenir en vous mordant dans un ou deux "territoires". 

84
Michael Stum

Alors que les réponses précédentes sont correctes, certains compilateurs ont des options pour casser le standard et utiliser le type le plus petit qui contiendra toutes les valeurs.

Exemple avec GCC (modification dans Manuel GCC ):

enum ord __attribute__ ((__packed__)) {
    FIRST = 1,
    SECOND,
    THIRD
};
STATIC_ASSERT( sizeof(enum ord) == 1 )
13
Kevin Cox

En langage C, une enum est garantie de taille int. Il existe une option de compilation (-fshort-enums) pour la rendre aussi courte (utile surtout si les valeurs ne dépassent pas 64 Ko). Il n'y a pas d'option de compilation pour augmenter sa taille à 64 bits.

0
rashok