1. 程式人生 > >C語言中以字符串形式輸出枚舉變量

C語言中以字符串形式輸出枚舉變量

main rfi tin port src sample .com com box

C語言中以字符串形式輸出枚舉變量

摘自:https://blog.csdn.net/haifeilang/article/details/41079255

2014年11月13日 15:17:20 haifeilang 閱讀數:6295

每個枚舉常量對應一個整形數字,很多時候可以像整形一樣使用,這個大家都知道;但是如果要求打印枚舉變量名的字符串,辦法也有很多,查看網上方法幾乎都需要轉換,要麽用數組,下面要說的是一種可以算是直接打印的新方法;

#會將後面的內容作為字符串返回

如果想讓#後面的內容作為宏使用,需要使用兩層宏展開,且使用宏使用的宏裏面的每個字符見到的字符都會作為返回字符串的一部分。如

printf("10->%s\r\n", MY_DEFINE2(MY_STRING2));

即:

#define MY_DEFINE(R) #R
#define MY_DEFINE2(R) MY_DEFINE(R)
 1 #include <stdio.h>
 2 
 3 #define MY_INT 7777
 4 #define MY_STRING "9999"
 5 #define MY_STRING2 "9999\"8OK"000(888)
 6 #define ENUM_CHIP_TYPE_CASE(x)   case x: return(#x);
 7
#define MY_DEFINE(R) #R 8 #define MY_DEFINE2(R) MY_DEFINE(R) 9
10 enum cvmx_chip_types_enum { 11 CVMX_CHIP_TYPE_NULL = 0, 12 CVMX_CHIP_TYPE_DEPRECATED = 1, 13 CVMX_CHIP_TYPE_OCTEON_SAMPLE = 2, 14 CVMX_CHIP_TYPE_MAX 15 }; 16 17 18 static inline const char *cvmx_chip_type_to_string(enum
cvmx_chip_types_enum type) 19 { 20 switch (type) 21 { 22 ENUM_CHIP_TYPE_CASE(CVMX_CHIP_TYPE_NULL) 23 ENUM_CHIP_TYPE_CASE(CVMX_CHIP_TYPE_DEPRECATED) 24 ENUM_CHIP_TYPE_CASE(CVMX_CHIP_TYPE_OCTEON_SAMPLE) 25 ENUM_CHIP_TYPE_CASE(CVMX_CHIP_TYPE_MAX) 26 } 27 return "Unsupported Chip"; 28 29 } 30 31 int main() 32 { 33 enum cvmx_chip_types_enum a; 34 int my_int_test = 7; 35 36 printf("1->%s\r\n", MY_DEFINE(CVMX_CHIP_TYPE_DEPRECATED)); 37 printf("2->%s\r\n", MY_DEFINE(my_int_test)); 38 printf("3->%s\r\n", MY_DEFINE(8888)); 39 printf("4->%s\r\n", MY_DEFINE(MY_INT)); 40 printf("5->%s\r\n", MY_DEFINE2(MY_INT)); 41 printf("6->%s\r\n", "MY_INT"); 42 printf("7->%s\r\n", MY_DEFINE(MY_STRING)); 43 printf("8->%s\r\n", MY_DEFINE2(MY_STRING)); 44 printf("9->%s\r\n", MY_DEFINE(MY_STRING2)); 45 printf("10->%s\r\n", MY_DEFINE2(MY_STRING2)); 46 47 while(1) 48 { 49 printf("input(0~3):"); 50 scanf("%d",&a); 51 if(a<CVMX_CHIP_TYPE_NULL||a>CVMX_CHIP_TYPE_MAX) 52 { 53 printf("error,you must input number between 0 and 3,please try again!\n\n"); 54 continue; 55 } 56 printf("\n"); 57 58 printf("the result:%s \n\n",cvmx_chip_type_to_string(a)); 59 } 60 61 return 0; 62 }


結果測試:

技術分享圖片

如何不想全部打印出名字,只想打印出後面幾個字符,例如“CVMX_CHIP_TYPE_DEPRECATED”,

我只想要打印後面“DEPRECATED”字符串,上面代碼只需修改宏:

#define ENUM_CHIP_TYPE_CASE(x) case x: return(#x); 改為下面所示

#define ENUM_CHIP_TYPE_CASE(x) case x: return(#x+15); //從第16個字符串開始打印,不要前面15個

結果如下:

技術分享圖片

挺實用的技巧吧!

技術分享圖片

C語言中以字符串形式輸出枚舉變量