2012/03/08

C語言巨集macro: 將enum的integer變數 印出變成string

我記得之前有個同事有透過程式碼的撰寫
將enum的數字變數,轉成string
但是原始碼我後來忘記了
現在努力回想, 也在網路找一些資料
試圖拼湊回來

方法一

好像可以了..

#define STATE_STRLENGTH 32#define stringiz(arg) #arg   //將數字前面加# 就是字串化/* enum states for the power meter */typedef enum {	STATE_UNSET = 0,	STATE_INIT,		STATE_OPEN,	STATE_PROBE,	STATE_EARLYRESUME,	STATE_EARLYSUSPEND,	STATE_RESUME,	STATE_SUSPEND,	STATE_REMOVE,	STATE_SHUTDOWN,	STATE_CLOSE,	STATE_EXIT,	STATE_MAX,} Numbers;char num_str[STATE_MAX][STATE_STRLENGTH] = {	stringiz(STATE_UNSET),	stringiz(STATE_INIT),	stringiz(STATE_OPEN),	stringiz(STATE_PROBE),	stringiz(STATE_EARLYRESUME),	stringiz(STATE_EARLYSUSPEND),	stringiz(STATE_RESUME),	stringiz(STATE_SUSPEND),	stringiz(STATE_REMOVE),	stringiz(STATE_SHUTDOWN),	stringiz(STATE_CLOSE),	stringiz(STATE_EXIT),};

要用的時候

void main(){ int val = xxx; printf("%d:%s\n", val, num_str[val]);}

另外一種寫法

透過switch case來處理文字
而不是初始時就設定好文字

void state_stringiz(void) {	int i;		for(i = STATE_UNSET; i < STATE_MAX; i++){		switch(i) {			case STATE_UNSET:				strcpy(num_str[i],stringiz(STATE_UNSET));				break;				case STATE_INIT:				strcpy(num_str[i],stringiz(STATE_INIT));				break;				case STATE_OPEN:				strcpy(num_str[i],stringiz(STATE_OPEN));				break;			case STATE_PROBE:				strcpy(num_str[i],stringiz(STATE_PROBE));				break;						case STATE_EARLYRESUME:				strcpy(num_str[i],stringiz(STATE_EARLYRESUME));				break;			case STATE_EARLYSUSPEND:				strcpy(num_str[i],stringiz(STATE_EARLYSUSPEND));				break;			case STATE_RESUME:				strcpy(num_str[i],stringiz(STATE_RESUME));				break;			case STATE_SUSPEND:				strcpy(num_str[i],stringiz(STATE_SUSPEND));				break;			case STATE_REMOVE:				strcpy(num_str[i],stringiz(STATE_REMOVE));				break;			case STATE_SHUTDOWN:				strcpy(num_str[i],stringiz(STATE_SHUTDOWN));				break;			case STATE_CLOSE:				strcpy(num_str[i],stringiz(STATE_CLOSE));				break;			case STATE_EXIT:				strcpy(num_str[i],stringiz(STATE_EXIT));				break;		    default:		      	break; //no match		}  }}

沒有留言:

張貼留言