Representación de cadena de valores enumeración

gcc 4.4.2 c89

Tengo la siguiente enumeración:

enum drop_options_e { drop_ssm, drop_snm, drop_ssb }; 

Me pregunto si esa es la mejor manera de obtener el valor de representación de cadena de la enumeración.

Así que básicamente, en lugar de devolver el valor de 0 para drop_ssm, podría obtener el ‘drop_ssm’ en su lugar.

Muchas gracias por cualquier consejo,

Una forma es hacer esto:

 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"}; 

cuando quieres una representación de cadena de una enumeración, puedes drop_options_s[enum];

Utilizando la técnica X-Macro :

items archivo:

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

fuente:

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

Así que ahora item_names[drop_ssm] te dará la cadena de texto "drop_ssm"

C no tiene apoyo para eso. Tendrás que tener un interruptor o equivalente en algún lugar.

Si tiene un comstackdor que admite los inicializadores designados de C99, puede mejorar la respuesta 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) }; 

(Con este método, no tiene que preocuparse de que los inicializadores de matriz estén en el mismo orden que los valores de enumeración).

No hay nada fuera de la caja. Puedes hacer algunas cosas muy interesantes con las macros y el procesador Boost.Preprocessor, pero está bastante involucrado, y no estoy seguro de qué tan bien funcionaría en C; He hecho cosas en C ++ que me permiten escribir, por ejemplo:

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

La mejor manera que veo para manejar esto es crear una matriz de traducción. Algo como:

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

Esto puede ser problemático si su enumeración es bastante grande.

Me han gustado todas las respuestas aquí! Durante los bashs, encontré algo muy corto y agradable con 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);