2012-05-07 30 views
5

Tôi đã thấy liên kết nàyenums liên kết với chuỗi trong C

How to convert enum names to string in c

tôi có một loạt các enums được xác định theo cách sau đây trong ứng dụng cung cấp tập tin tiêu đề thư viện (mà tôi không thể thay đổi):

Ngoài ra enums thưa thớt.

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

Tôi muốn in các giá trị trong chức năng của tôi ví dụ tôi muốn in ERROR_NONE thay vì 59. Có cách nào tốt hơn chỉ sử dụng các cấu trúc switchcase hoặc if else để hoàn thành công việc này không? Ví dụ

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

Tại sao không sử dụng toán tử [stringizing] (http://msdn.microsoft.com/en-us/library/7e3a913x (v = vs.80) .aspx)? Bạn có thể cho chúng tôi thấy một số mã mà bạn đang cố in các giá trị enum này không? –

Trả lời

1

FAQ 11.17. Sử dụng macro xstr(). Có lẽ bạn nên sử dụng:

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

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

Một ứng dụng trực tiếp của nhà điều hành stringizing có thể hữu ích

#define stringize(x) #x 

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

Bạn đã nói rằng bạn không thể thay đổi các tập tin thư viện. Nếu bạn quyết định khác :), bạn có thể sử dụng X macro như sau

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. 

Read more here

EDIT: Với ví dụ cụ thể mà bạn đang hiển thị chúng tôi, tôi sợ, switch-case là gần nhất bạn có thể nhận được, đặc biệt là khi bạn có thưa thớt enums.

+0

Bạn cần macro hai bước để buộc cả mở rộng và xâu chuỗi. Xem http://c-faq.com/ansi/stringize.html. – dirkgently

+0

@dirkgently Nhưng OP dường như chỉ muốn [this] (http://ideone.com/VIKdu) –