2012-05-07 23 views
5

que he visto este enlaceenumeraciones asocian con cadenas en C

How to convert enum names to string in c

tengo una serie de enums definido de la siguiente manera en el archivo de cabecera de la biblioteca de cliente suministrado (que no puedo cambiar):

También las enumeraciones son dispersas.

typedef enum 
{ 
    ERROR_NONE=59, 
    ERROR_A=65, 
    ERROR_B=67 
} 

Quiero imprimir estos valores en función de mi por ejemplo me gustaría imprimir ERROR_NONE en lugar de 59. ¿Hay una mejor manera de usar construcciones switchcase o if else para hacer esto? Ejemplo

int Status=0; 
    /* some processing in library where Status changes to 59 */ 
    printf("Status = %d\n",Status); /* want to print ERROR_NONE instead of 59 */ 
+0

¿Por qué no usar el [operador de stringings] (http://msdn.microsoft.com/en-us/library/7e3a913x (v = vs.80) .aspx)? ¿Puede mostrarnos algún código en el que está tratando de imprimir estos valores enum? –

Respuesta

1

FAQ 11.17. Use la macro xstr(). Que es mejor usar lo siguiente:

#define str(x) #x 
#define xstr(x) str(x) 

printf("%s\n", xstr(ERROR_A)); 
3

Una aplicación directa del operador stringizing podría ser útil

#define stringize(x) #x 

printf("%s\n", stringize(ERROR_NONE)); 

Usted ha mencionado que no puede modificar el archivo de biblioteca. Si decide lo contrario :), puede utilizar macros X de la siguiente manera

enumstring.c 
#include <stdio.h> 

#define NAMES C(RED)C(GREEN)C(BLUE) 

#define C(x) x, 

enum color { NAMES TOP }; 

#undef C 

#define C(x) #x, 

const char * const color_name[] = { NAMES }; 

int main(void) 
{ printf("The color is %s.\n", color_name[ RED ]); 
    printf("There are %d colors.\n", TOP); } 

stdout 
The color is RED. 
There are 3 colors. 

Leer más here

EDITAR: Con el ejemplo concreto que nos está mostrando, me temo, switch-case es el más cercano a usted puede obtener, especialmente cuando tiene escasos enums.

+0

Necesita una macro de dos pasos para forzar tanto la expansión como la stringización. Ver http://c-faq.com/ansi/stringize.html. – dirkgently

+0

@dirkgently Pero el OP parece querer solo [esto] (http://ideone.com/VIKdu) –