Je crée un ensemble de valeurs d'énumération, mais j'ai besoin que chaque valeur d'énumération ait une largeur de 64 bits. Si je me souviens bien, un enum a généralement la même taille qu'un int; mais je pensais avoir lu quelque part que (au moins dans GCC) le compilateur peut faire l'énumération de toute largeur nécessaire pour contenir leurs valeurs. Alors, est-il possible d'avoir une énumération de 64 bits de large?
140
Réponses:
Il
enum
est garanti que An est suffisamment grand pour contenir desint
valeurs. 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 un,int
vous devrez utiliser des extensions spécifiques au compilateur pour ce faire.la source
enum
doit être plus grand que anint
ou plus petit? Après la réponse de @MichaelStum, votre première phrase devrait être "Anenum
est garanti uniquement pour entrer dans uneint
valeur."int
. La réponse de Michael Stum , qui fait référence à C99, dit qu'une énumération peut être aussi petite qu'unchar
.enum
est seulement garanti que la taille de l 'est suffisamment grande pour contenir la valeur du plus grand énumérateur de l'énumération.Tiré de la norme C actuelle (C99): http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf
Non pas que les compilateurs soient bons pour suivre la norme, mais essentiellement: Si votre enum contient autre chose qu'un int, vous êtes dans un "comportement non pris en charge profond qui peut revenir vous mordre dans un an ou deux" territoire.
la source
int
.short
etlong
sont également des types entiers, et quel que soit le choix de l'implémentation, toutes les valeurs doivent correspondre (" doit être capable de représenter les valeurs de tous les membres de l'énumération").int
, la variable d'énumération réelle peut être d'un autre type. Il s'agit d'une incohérence bien connue dans la norme.enum my_enum { my_value }
,my_value
aura un typeint
, maisenum my_enum
peut avoir un type défini par l'implémentation qui doit au moins représenter toutes les valeurs d'énumération. Ilmy_value
peut donc y avoir une conversion réduite enenum my_enum
, mais il est garanti de ne pas dépasser.Bien que les réponses précédentes soient correctes, certains compilateurs ont des options pour briser la norme et utiliser le plus petit type qui contiendra toutes les valeurs.
Exemple avec GCC (documentation dans le manuel GCC ):
la source
Définissez simplement la dernière valeur de l'énumération sur une valeur suffisamment grande pour lui donner la taille que vous souhaitez que l'énumération soit, elle devrait alors être de cette taille:
la source
Nous n'avons aucun contrôle sur la taille d'une
enum
variable. Cela dépend totalement de l'implémentation, et le compilateur donne la possibilité de stocker un nom pour un entier en utilisantenum
, doncenum
suit la taille d'un entier.la source
En langage C, an
enum
est garanti d'avoir la taille d'unint
. Il existe une option de compilation (-fshort-enums
) pour le rendre aussi court (ceci est principalement utile dans le cas où les valeurs ne dépassent pas 64 Ko). Il n'y a pas d'option de compilation pour augmenter sa taille à 64 bits.la source
Considérez ce code:
Il donnera 4 en sortie. Ainsi, quel que soit le nombre d'éléments qu'un
enum
contient, sa taille est toujours fixe.la source