Cela peut avoir été répondu ailleurs mais je n'ai pas pu trouver de réponse appropriée.
J'ai ce code:
enum enumWizardPage
{
WP_NONE = 0x00,
WP_CMDID = 0x01,
WP_LEAGUES = 0x02,
WP_TEAMS = 0x04,
WP_COMP = 0x08,
WP_DIVISIONS = 0x10,
WP_FORMULAS = 0x20,
WP_FINISHED = 0x40,
};
Ce qui est hérité et je dois le modifier en ajoutant quelques nouvelles valeurs. Le problème est que chaque valeur doit être un bit unique afin qu'elles puissent être OR combinées à un bitmap.
Les valeurs sont définies en utilisant le format hexadécimal # x ##, mais je me demande si c'est le maximum qu'il peut stocker? Quel sera l’effet, le cas échéant, si je change mon code en
enum enumWizardPage
{
WP_NONE = 0x0000,
WP_CMDID = 0x0001,
WP_LEAGUES = 0x0002,
WP_TEAMS = 0x0004,
WP_COMP = 0x0008,
WP_DIVISIONS = 0x0010,
WP_FORMULAS = 0x0020,
WP_FINISHED = 0x0040,
};
De N4659 C++ 7.2/5 :
Pour une énumération dont le type sous-jacent n'est pas fixe, le type sous-jacent est un type intégral qui peut représenter toutes les valeurs d'énumérateur définies dans l'énumération. Si aucun type intégral ne peut représenter toutes les valeurs de l'énumérateur, 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 supérieur à
int
sauf si la valeur d'un énumérateur ne peut pas tenir dans unint
ouunsigned int
. Si la liste d'énumérateurs est vide, le type sous-jacent est comme si l'énumération avait un seul énumérateur avec la valeur 0.
Le type d'une énumération C++ est l'énumération elle-même. Sa plage est plutôt arbitraire, mais en termes pratiques, son type sous-jacent est un int
.
Cependant, il est implicitement converti en int
partout où il est utilisé.
Cela a changé depuis C++ 11, qui a introduit les énumérations typées. Un enum
non typé est maintenant défini comme étant au moins la largeur de int
(et plus large si des valeurs plus grandes sont nécessaires). Cependant, étant donné un enum
typé défini comme suit:
enum name : type {};
Une énumération de type name
a un type sous-jacent de type
. Par exemple, enum : char
définit un enum
de la même largeur que char
au lieu de int
.
De plus, un enum
peut être explicitement défini comme suit:
enum class name : type {
value = 0,
// ...
};
(Où name
est requis, mais type
est facultatif.) Un enum
déclaré de cette façon ne sera plus implicitement converti en son type sous-jacent (nécessitant un static_cast<>
) et les valeurs doivent être référencées avec un nom complet. Dans cet exemple, pour affecter value
à une variable enum
, vous devez vous y référer en tant que name::value
.
L'IIRC est représenté comme int en mémoire. Mais gcc a basculé -fshort-enum
pour en faire un type entier le plus court qui corresponde à toutes les valeurs, si vous avez besoin d'économiser de l'espace. D'autres compilateurs auront quelque chose de similaire.