podría utilizar el preprocesador para hacer esto, creo que esta técnica se llama X-Macros:
/* fruits.def */
X(APPLE)
X(MANGO)
X(ORANGE)
/* file.c */
enum fruits {
#define X(a) a,
#include "fruits.def"
#undef X
};
const char *fruit_name[] = {
#define X(a) #a,
#include "fruits.def"
#undef X
};
Tenga en cuenta que la última entrada incluye una coma final, que se deja en C99 (pero no en C89). Si eso es un problema, puede agregar valores sentinales. También es posible hacer que la macro más complicado, dando múltiples argumentos para los nombres personalizados o valores de enumeración, etc:
X(APPLE, Apple, 2)
#define X(a,b,c) a = c, /* in enum */
#define X(a,b,c) [c] = #b, /* in name array */
Limitaciones: No se puede tener constantes negativas y la matriz es sizeof (char *) * largest_constant
.
Pero se puede evitar tanto mediante el uso de una tabla de consulta adicional:
int map[] = {
#define X(a,b,c) c,
#include "fruits.def"
#undef X
};
Esto no funciona, por supuesto. Lo que funciona es la generación de un sistema adicional de enum
constantes como claves para los nombres:
enum fruits {
#define X(a,b,c) a ## _KEY,
#include "fruits.def"
#undef X
#define X(a,b,c) a = c,
#include "fruits.def"
#undef X
};
ya se puede encontrar el nombre de X(PINEAPPLE, Pineapple, -40)
utilizando fruit_name[PINEAPPLE_KEY]
.
Las personas notaron que no les gustaba el archivo adicional de inclusión. No necesita este archivo adicional, también utiliza un #define
. Esto puede ser más apropiada para pequeñas listas:
#define FRUIT_LIST X(APPLE) X(ORANGE)
y reemplazar #include "fruits.def
con FRUIT_LIST
en los ejemplos anteriores.
posible duplicado http://stackoverflow.com/questions/3342726/c-print-out-enum-value-as-text –
Esto es un FAQ todo sobre los intertubes y probablemente sea un imbécil aquí, aunque no lo hice. Respuesta: no, no se puede hacer (sin jumoing a través de aros como @Naveen sugiere y corre el riesgo de desconectarse. Si está dispuesto a correr ese riesgo, muchas personas parecen usar esta solución. Es mejor que nada , pero es un destino tentador ...). – Mawg
@Eugen Constantin Dinca Esa pregunta es solo C++, mientras que el OP aquí parece querer una solución C. – schot