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个
结果如下:
挺实用的技巧吧!