2 votes

Est-ce que le type enum est cross-platform en C++ ?

Possible Duplicate:
Quelle est la taille des données de type enum en C++?

Comment le type de données enum est-il stocké en interne (j'imagine en tant qu'entier 8/16/32 bits?) et peut-il être sérialisé en toute sécurité ou devrais-je utiliser quelque chose comme quint8 pour stocker la valeur? Autrement dit, est-ce que sizeof(MyEnum) est garanti d'avoir la même taille sur toutes les plateformes?

9voto

phresnel Points 20082

En d'autres termes, la taille de MyEnum est-elle garantie d'être la même taille sur toutes les plateformes ?

Vous pouvez définir un type explicite en C++11 (mais pas dans les incarnations antérieures de C++) :

enum class Drug : char {
    Cocaine,
    Cannabis,
    Crack
};

ou

enum Sex : uint32_t {
    Male,
    Female,
    Other
};

En utilisant class devant enum, cela force les utilisateurs de Drug à l'écrire Drug::Cocaine, pour les énumérations sans le class devant leur déclaration, l'orthographe est facultative (Sex::Male et Female sont tous les deux valides).

Les astuces pour les C++ antérieurs à 2011 incluent ce qui suit, ce qui force une taille minimale :

enum Frob {
    ...
    FORCE_DWORD          = 0x7fffffff
};

Observé en pratique par exemple dans l'implémentation du DirectX-SDK de ReactOS sur ReactOS' DirectSDK.


Références aux normes

7.2 Déclarations d'énumération [dcl.enum]

[...]

§6: Pour une énumération dont le type sous-jacent n'est pas fixé, le type sous-jacent est un type intégral qui peut représenter toutes les valeurs des énumérateurs définis dans l'énumération. Si aucun type intégral ne peut représenter toutes les valeurs des énumérateurs, l'énumération est incorrecte. Il est défini par l'implémentation quel type intégral est utilisé comme type sous-jacent, sauf que le type sous-jacent ne doit pas être plus grand que int à moins que la valeur d'un énumérateur ne rentre pas dans un int ou un unsigned int. Si la liste des énumérateurs est vide, le type sous-jacent est comme si l'énumération avait un seul énumérateur avec une valeur de 0.

3voto

Carl Norum Points 114072

Certainement pas. Beaucoup de caractéristiques des énumérations sont définies par l'implémentation. Assurez-vous de choisir un vrai type (sûr) et de le sérialiser.

1voto

piokuc Points 11938

La taille de l'énumération est la même que celle de int, donc il n'est pas garanti qu'elle ait la même longueur partout.

Utilisez l'un des types définis dans stdint.h, comme int32_t, int16_t, etc.

0voto

Prof. Falken Points 10242

Il sera généralement le même qu'un int, qui peut être de différentes tailles. Voir cette réponse.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X