Comment vérifier si une variable enum est valide?
J'ai un enum:
enum myenum{
typeA,
typeB,
typeC
} myenum_t;
Ensuite, une des fonctions est d'être appelée avec un enum paramètre:
int myfunction(myenum_t param1)
{
switch(param1)
{
case typeA:
case typeB:
case typeC:
//do the work
break;
default:
printf("Invalid parameter");
}
return 0;
}
Mais, comme myenum_t
grandit avec de plus en plus de valeurs, myfunction
n'a pas l'air si élégant.
Est-il une meilleure façon de vérifier si un enum est valide ou pas?
source d'informationauteur mustafa
Vous devez vous connecter pour publier un commentaire.
D'une convention commune pour ce qui est de faire quelque chose comme ceci:
Ensuite, vous pouvez vérifier pour
(t < num_types)
.Si vous ajoutez ultérieurement plus d'énumérations, par exemple
puis
num_types
est automatiquement mis à jour et que votre erreur de code de vérification n'a pas besoin de changer.Vous pouvez utiliser un bit à bit enum:
Excuse moi, il me semble que j'ai lu la question mal.
Il semble que ce que vous voulez faire est de déterminer si vous avez une bonne valeur passée dans, pas un hasard option non valide. Dans ce cas, le plus logique option est ceci:
C'est, bien sûr, en supposant que vous ne définissez pas de manuel des valeurs de l'enum, ce qui est assez rare, sauf si l'aide au niveau du bit enums.
Oui.
Laisser le compilateur faire son travail, ne jette pas
int
à unenum
type et vous devriez être bon.Un truc que j'ai utilisé dans le passé:
et de vérifier ensuite si votre valeur est
> FIRST_FOO && < LAST_FOO
1.Bien sûr, cela suppose qu'il n'y a pas des écarts entre vos valeurs d'énumération.
Sinon, non, il n'y a pas de bonne méthode pour faire ce que vous demandez (au moins en C).
1 à Partir de la dernière ligne Norme Du Langage C:
Ne pouvez pas vous aussi faire quelque chose comme
Malheureusement, il n'y a pas un moyen simple de le faire de langue de niveau (au moins avec
C
), vous avez juste à vous assurer que vous utilisez uniquement des variables définies parenum
.Mais vous pouvez activer l'une des opérations suivantes avertissements du compilateur avec
-Werror
:-Wswitch
-Wswitch-default
-Wswitch-enum
Cela fait construire échouer si l'une des énumérations est oubliée à l'intérieur de l'interrupteur.
Énumérations en C++ ont déjà plus forte que dans C.
Prendre la suite de programme simple:
Utilisant le compilateur GCC je vais obtenir cette erreur:
De sorte que vous pouvez voir les membres de l'énumération sont déjà cochée.
Si vous voulez encore plus forte de la vérification de type, et ont un C++11 est capable de compilateur, vous pouvez utiliser encore plus forte de la vérification de type pour les énumérations, voir http://en.wikipedia.org/wiki/C%2B%2B11#Strongly_typed_enumerations.