web-dev-qa-db-fra.com

Quel est le type sous-jacent d'une énumération c ++?

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,   
};
40
CodeFusionMobile

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 un int ou unsigned 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.

41

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é.

Modifications de C++ 11

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.

49
greyfade

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.

1
cube