J'ai posté autre question: quel type Devrais-je utiliser une représentation binaire de C Enum? , et par la réponse, je dois connaître le type de données Enum de mon compilateur. P>
Quel est le type de données de C ENUM sur CLANG COMPILER? P>
3 Réponses :
Eh bien, un compilateur peut choisir une taille entière assez gros mais je suppose que cela choisira une taille "natif" (un "mot" = la taille du registre, doit être long pour le mode X86 32 bits ou longtemps pendant x64). Pour votre structure privée, vous ne devriez pas m'en soucier, mais si vous souhaitez le sérialiser à un fichier ou sur le réseau, vous devez utiliser explicitement un type d'entier suffisamment grand (par exemple long) afin que vous puissiez le ramasser avec un autre compilateur / langue. Sans maux de tête.
Si vous voulez vraiment savoir, demandez simplement au compilateur: p>
Comme la plupart des compilateurs C (tous, peut-être) C, la taille d'un type énuméré peut varier. Voici un exemple de programme et sa sortie: sortie: p> tout ce que la norme nécessite: p> Le choix du type est défini par la mise en œuvre, mais doit être capable de représenter les valeurs de tous les membres de l'énumération. P>
blockQuote> Une recherche sur le Web rapide n'a pas abouti à un manuel de Clang spécifié son comportement, mais l'un est presque certainement là quelque part. p> p>
Clang-11 met correctement mes valeurs de 64 bits dans un type 32 bits. Ils sont tronqués. Donc, apparemment, tous les compilateurs traditionnels suivent la spécification. : - /
En plus de la réponse de Carl, il peut même être compatible avec un type signé ou non signé si quelque chose de ce qui convient mieux. Par exemple, il pourrait em> mais ne doit pas dans avoir btw the constantes petit code> dans un
signé Char code> et
gros code> dans un
non signé char code>. p>
m code>,
a code> et
b < / code> ne sont pas de type d'énumération mais toujours de type
int code>. p>
int code>. En mode C99
gcc code> émet une erreur (qui est correct) mais
clang code> uniquement un avertissement et qu'un type plus large pour représenter le
Enum code>. p> p>