classe enum (extensions du composant C++)
Déclare une énumération, qui est un type défini par l'utilisateur qui se compose d'un jeu de constantes nommées appelées énumérateurs.
Tous les runtimes
Remarques
C++/CX et C++/CLI prennent en charge les classes public enum class et private enum class qui sont semblables à la classe enum C++ standard, avec ajout du spécificateur d'accessibilité.Pour plus d'informations sur l'ancien mot clé C++ standard, enum, consultez Déclarations d'énumération C++.
Windows Runtime
Syntaxe
access enum class enumeration-identifier [:underlying-type] { enumerator-list } [var];
access enum struct enumeration-identifier [:underlying-type] { enumerator-list } [var];
Paramètres
accès
L'accessibilité de l'énumération, qui peut être public ou private.enumeration-identifier
Nom de l'énumération.type sous-jacent
(Facultatif) Type sous-jacent de l'énumération.(Facultatif.Windows Runtime uniquement) Type sous-jacent de l'énumération, qui peut être bool, char, char16, int16, uint16, int, uint32, int64 ou uint64.
enumerator-list
Une liste, délimitée par des virgules, de noms d'énumérateurs.La valeur de chaque énumérateur est une expression constante qui est définie implicitement par le compilateur ou explicitement par la notation, énumérateur=expression constante.Par défaut, la valeur du premier énumérateur est zéro s'il est défini implicitement.La valeur de chaque énumérateur suivant implicitement défini est la valeur de l'énumérateur précédent + 1.
var
(Facultatif) Nom d'une variable du type énumération.
Remarques
Pour plus d'informations et d'exemples, consultez Enums.
Notez que le compilateur émet des messages d'erreur si l'expression constante qui définit la valeur d'un énumérateur ne peut pas être représentée par le type sous-jacent.Toutefois, le compilateur ne signale pas d'erreur pour une valeur qui n'est pas appropriée pour le type sous-jacent.Par exemple :
Si le type sous-jacent est numérique et si un énumérateur spécifie la valeur maximale pour ce type, la valeur de l'énumération implicitement définie ne peut pas être représentée.
Si le type sous-jacent est bool et si plus de deux énumérateurs sont implicitement définis, les énumérateurs au-delà des deux premiers ne peuvent pas être représentés.
Si le type sous-jacent est char16 et si la valeur d'énumération s'étend de 0xD800 à 0xDFFF, la valeur peut être représentée.Toutefois, la valeur est logiquement incorrecte, car elle représente la moitié d'une paire de substitution Unicode et ne doit pas s'afficher de manière isolée.
Configuration requise
Option du compilateur : /ZW
Common Language Runtime
Syntaxe
access enum class name [:type] { enumerator-list } var;
access enum struct name [:type] { enumerator-list } var;
Paramètres
access
L'accessibilité de l'enum.Peut être public ou private.enumerator-list
Liste, délimitée par des virgules, des identificateurs (énumérateurs) dans l'énumération.name
Nom de l'énumération.Les énumérations managées anonymes ne sont pas autorisées.type (facultatif)
Type sous-jacent des identifiants.Cela peut être tout type scalaire, tel que les versions signées ou non signées de int, short ou long.bool ou char est également autorisé.var (facultatif)
Nom d'une variable du type énumération.
Remarques
enum class et enum struct sont des déclarations équivalentes.
Il existe deux types d'enums : managé et standard.
Un enum managé peut être défini de la façon suivante,
enum class day {sun, mon };
et équivaut sémantiquement à :
ref class day {
public:
static const int sun = 0;
static const int mon = 1;
};
Un enum standard peut être défini de la façon suivante :
enum day2 {sun, mon, };
et équivaut sémantiquement à :
static const int sun = 0;
static const int mon = 1;
Les noms d'énumérateur managés (identificateurs) ne sont pas injectés dans la portée où l'énumération est définie ; toutes les références aux énumérateurs doivent être qualifiées complètes (nom::identificateur).Pour cette raison, vous ne pouvez pas définir un enum managé anonyme.
Les énumérateurs d'un enum standard sont fortement injectés dans la portée englobante.Autrement dit, s'il existe un autre symbole qui porte le même nom qu'un énumérateur de la portée englobante, le compilateur génèrera une erreur.
Dans Visual C++ 2002 et Visual C++ 2003, les énumérateurs étaient injectés faiblement (visibles dans la portée englobante sauf s'il y avait un autre identificateur avec le même nom).
Si un enum C++ standard est défini (sans class ou struct), la compilation avec /clr entraîne la compilation de l'énumération en tant qu'enum managé.L'énumération conserve la sémantique d'une énumération non managée.Notez que le compilateur injecte un attribut Microsoft::VisualC::NativeEnumAttribute, reconnu par le compilateur Visual C++, pour identifier l'intention d'un programmeur d'obtenir un enum natif.D'autres compilateurs verront simplement l'enum standard comme un enum managé.
Un enum nommé et standard compilé avec /clr sera visible dans l'assembly comme un enum managé. Il peut être consommé par tout autre compilateur managé.Toutefois, un enum standard sans nom ne sera pas visible publiquement à partir de l'assembly.
Dans Visual C++ 2002 et Visual C++ 2003, un énumérateur standard utilisé comme type d'un paramètre de fonction :
// mcppv2_enum.cpp
// compile with: /clr
enum E { a, b };
void f(E) {System::Console::WriteLine("hi");}
int main() {
E myi = b;
f(myi);
}
émettrait ce qui suit en MSIL pour la signature de la fonction :
void f(int32);
Toutefois, dans les versions actuelles du compilateur, l'enum standard est émis en tant qu'enum managé avec un [NativeEnumAttribute] et le suivant est émis en MSIL pour la signature de la fonction :
void f(E)
Pour plus d'informations sur les enums natifs, consultez Déclarations d'énumération C++.
Dans l'environnement de développement, vous pouvez obtenir de l'aide F1 sur ces mots clés en mettant en surbrillance le mot clé, (enum class, par exemple) et en appuyant sur F1.
Pour plus d'informations sur les enums CLR, consultez :
Configuration requise
Option du compilateur : /clr
Exemples
Exemple
desc
// mcppv2_enum_2.cpp
// compile with: /clr
// managed enum
public enum class m { a, b };
// standard enum
public enum n { c, d };
// unnamed, standard enum
public enum { e, f } o;
int main() {
// consume managed enum
m mym = m::b;
System::Console::WriteLine("no automatic conversion to int: {0}", mym);
System::Console::WriteLine("convert to int: {0}", (int)mym);
// consume standard enum
n myn = d;
System::Console::WriteLine(myn);
// consume standard, unnamed enum
o = f;
System::Console::WriteLine(o);
}Optionally, copy this sequence of tags for each example you want, then populate the text nodes. That is, after section+title("Examples")+content, insert: para+embeddedLabel ("Example")+para(sample description); code(sample); para+embeddedLabel("Output"); computerOutput(sample output, including 'br' tag instead of newlines)
Sortie