Comment convertir enum noms de chaîne en c
Est-il possible de convertir énumérateur des noms de chaîne en C?
Vous devez vous connecter pour publier un commentaire.
Est-il possible de convertir énumérateur des noms de chaîne en C?
Vous devez vous connecter pour publier un commentaire.
Un chemin, ce qui rend le préprocesseur faire le travail. Il assure également vos énumérations et les chaînes de caractères sont en synchronisation.
Après le préprocesseur est fait, vous aurez:
Alors vous pourriez faire quelque chose comme:
Si le cas d'utilisation est littéralement juste l'impression de l'enum nom, ajouter les macros suivantes:
Alors:
Dans ce cas, il peut sembler comme les deux au niveau macro est superflu, toutefois, en raison de la façon dont stringification travaille en C, il est nécessaire dans certains cas. Par exemple, disons que nous voulons utiliser un #define avec un enum:
La sortie serait:
C'est parce que str sera stringify l'entrée foo plutôt que de l'étendre à apple. En utilisant xstr la macro extension est faite en premier, alors que le résultat est stringified.
Voir Stringification pour plus d'informations.
#define GENERATE_ENUM(ENUM) PREFIX##ENUM,
Dans une situation où vous avez ceci:
Je tiens à mettre ceci dans le fichier d'en-tête où l'enum est défini:
enumToString(apple)
que de se taper"apple"
? C'est pas comme si il n'y a aucune sécurité n'importe où. Sauf que je suis absent quelque chose de ce que vous suggérez ici est inutile et juste réussit à obscurcissement de code.stringFromFruit()
avec une valeur non valide, la macro est simplement là parce que c'est ce que j'aime à utiliser. Rien de plus. Je peux comprendre que les OP ne considère pas ça pratique, c'est ce que la deuxième réponse est pour.static inline const char *stringFromFruit(enum fruit f)
.Il n'y a pas de moyen simple de l'atteint directement. Mais P99 a des macros qui vous permettent de créer un tel type de fonction automatiquement:
dans un fichier d'en-tête, et
dans une unité de compilation (.fichier c) devrait ensuite faire l'affaire, dans cet exemple, la fonction serait alors appelé
color_getname
.J'ai trouvé un préprocesseur C truc qui est en train de faire le même travail sans la déclaration d'une baie dédiée chaîne (Source: http://userpage.fu-berlin.de/~ram/pub/pub_jf47ht81Ht/c_preprocessor_applications_en).
Séquentielle des enums
La suite de l'invention de Stefan Ram, séquentielle des enums (sans explicitement indiquant l'index, par exemple
enum {foo=-1, foo1 = 1}
) peut être réalisé comme ce génie astuce:Cela donne le résultat suivant:
Non-Séquentielle des enums
Car je voulais une carte codes d'erreur les définitions sont de la matrice de chaîne, de sorte que je peux ajouter le raw erreur de définition de l'erreur code d'erreur (par exemple,
"The error is 3 (LC_FT_DEVICE_NOT_OPENED)."
), j'ai étendu le code de cette façon que vous pouvez facilement déterminer l'index requis pour les valeurs enum:Dans cet exemple, le préprocesseur C va générer le code suivant:
Il en résulte à la suite de la mise en œuvre des capacités:
Une fonction telle que, sans la validation de l'enum est un peu dangereux. Je suggère d'utiliser une instruction switch. Un autre avantage est que cela peut être utilisé pour les énumérations, qui ont défini les valeurs, par exemple pour les drapeaux, où les valeurs sont 1,2,4,8,16 etc.
Aussi mettre toutes vos enum chaînes dans un tableau:-
définir les indices dans un fichier d'en-tête:-
Faire cela rend plus facile à produire des versions différentes, par exemple si vous voulez faire des versions internationales de votre programme avec d'autres langues.
L'aide d'une macro, également dans le fichier d'en-tête:-
Faire une fonction avec une instruction switch, il doit retourner une
const char *
parce que les cordes statiques consts:-Si la programmation avec Windows puis le ID_ valeurs peuvent être les valeurs de la ressource.
(Si à l'aide de C++ puis toutes les fonctions peuvent avoir le même nom.
)
Une alternative plus simple à Hokyo du "Non-Séquentielle des enums" réponse, basée sur l'utilisation de désignations pour instancier le tableau de chaîne:
J'ai l'habitude de le faire: