représentation sous forme de chaîne des valeurs enum

gcc 4.4.2 c89

J’ai l’énumération suivante:

enum drop_options_e { drop_ssm, drop_snm, drop_ssb }; 

Je me demande simplement si c’est le meilleur moyen d’obtenir la valeur de représentation de chaîne à partir de l’énum.

Donc, fondamentalement, au lieu de renvoyer la valeur 0 pour drop_ssm, je pourrais obtenir le ‘drop_ssm’.

Merci beaucoup pour tout conseil,

Une façon est de faire comme ça:

 enum drop_options_e { drop_ssm = 0, drop_snm , drop_ssb , LAST_ENTRY /* Should be last entry */ }; const char* drop_options_s[LAST_ENTRY] = {"drop_ssm", "drop_snm", "drop_ssb"}; 

quand vous voulez une représentation sous forme de chaîne d’une énumération, vous pouvez drop_options_s[enum];

Utilisation de la technique X-Macro :

items fichier:

 ITEM(drop_ssm) ITEM(drop_snm) ITEM(drop_ssb) 

la source:

 #define ITEM(A) A, enum drop_options_e { #include "items" last }; #undef ITEMS #define ITEM(A) #A, char item_names[] = { #include "items" NULL}; 

Alors maintenant, item_names[drop_ssm] vous donnera la chaîne de texte "drop_ssm"

C n’a aucun soutien pour cela. Vous devrez avoir un commutateur ou équivalent quelque part.

Si vous avez un compilateur qui prend en charge les initialiseurs désignés de C99, vous pouvez améliorer la réponse de Naveen :

 enum drop_options_e { drop_ssm, drop_snm, drop_ssb }; #define ENUM_TO_S(e) [e] = #e const char *drop_options_s[] = { ENUM_TO_S(drop_ssm), ENUM_TO_S(drop_snm), ENUM_TO_S(drop_ssb) }; 

(Avec cette méthode, vous n’avez pas à vous soucier de l’initialisation des initialiseurs de tableaux dans le même ordre que les valeurs enum).

Il n’y a rien hors de la boîte. Vous pouvez faire des choses très intéressantes avec les macros et Boost.Preprocessor, mais c’est assez compliqué, et je ne sais pas à quel point cela fonctionnerait en C; J’ai fait des choses en C ++ qui me permettent d’écrire, par exemple:

 ENUM( ColorComponent, (red) (green) (blue) (alpha) ); // ... ColorComponent cc = ColorComponent_red; std::cout << "Color: " << toString(cc) << "\n"; 

Le meilleur moyen que j’ai de gérer cela est de créer un tableau de traduction. Quelque chose comme:

 struct { enum drop_options_e value; char *ssortingng; } TranslationArray[] = { drop_ssm, "drop_ssm", drop_snm, "drop_snm", drop_ssb, "drop_ssb", }; 

Cela peut être problématique si votre enum est assez gros.

J’ai tellement aimé toutes les réponses ici! En les essayant, j’ai trouvé quelque chose de très court et agréable avec la macro BOOST_PP_STRINGIZE de boost:

 //Define the enum you need typedef enum { INTEGER = 0, STRING = 1, BOOLEAN = 2, }eValueType; // Then in code use BOOST_PP_STRINGIZE, for example: char* valueTypeStr = BOOST_PP_STRINGIZE(INTEGER);