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


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

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

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

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

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

 

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個

結果如下:

 

  

挺實用的技巧吧!

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM