Maison > développement back-end > C++ > Que se passe-t-il lors de la conversion d'une valeur invalide en une classe Enum en C ?

Que se passe-t-il lors de la conversion d'une valeur invalide en une classe Enum en C ?

DDD
Libérer: 2024-12-24 20:22:12
original
374 Les gens l'ont consulté

What Happens When Casting an Invalid Value to an Enum Class in C  ?

Impact de la conversion d'une valeur non valide en classe Enum

Considérez l'extrait de code :

enum class Color : char { red = 0x1, yellow = 0x2 };
char *data = ReadFile();
Color color = static_cast<Color>(data[0]);
Copier après la connexion

Que se passe-t-il quand data[0] vaut 100 ? Selon les normes C 11 et C 14, la valeur résultante n'est pas spécifiée, ce qui signifie qu'elle peut être n'importe quoi.

CWG 1766 : Un changement de comportement

Cependant , après CWG 1766, la conversion d'une valeur en dehors de la plage de l'énumération en type enum peut désormais invoquer Undefined Comportement (UB). Ce changement n'affecte que les implémentations du compilateur qui choisissent d'appliquer le défaut à leurs modes de compilation C 11 et C 14.

Promotions intégrales dans les instructions Switch

Dans un commutateur instruction, la condition est convertie en un type intégral. Pour les énumérations sans portée, cette conversion s'applique aux entiers ; pour les énumérations étendues (classe enum et structure enum), aucune promotion n'a lieu. Quoi qu'il en soit, la valeur de la condition se situe dans la plage du type et de l'int sous-jacents, donc l'étiquette par défaut doit toujours être utilisée.

Attention aux énumérations non délimitées

Pour énumérations sans type sous-jacent fixe, la conversion de valeurs en dehors de la plage peut entraîner un comportement non spécifié (avant CWG 1766) ou UB (après GTC 1766). Ceci est illustré par l'énumération ColorUnfixed :

enum ColorUnfixed { red = 0x1, yellow = 0x2 };
Copier après la connexion

Étant donné que le type sous-jacent n'est pas fixe, la plage de ColorUnfixed est de 0 à 3, ce qui fait de 100 une valeur invalide.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal