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.