在工作中,经常需要打印错误码,错误码一般定义为枚举变量或无符号整型,但是在打印时直接打印出一个枚举变量,并不直观:
The state of system is 1.
如果能打印出一个枚举变量的字符串描述,则要清晰的多:
The state of system is busy.
本文提供一种可扩展的实现枚举变量的字符串描述的方法。
源代码如下:
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
unsigned id;
char *desc;
}MY_DESCRIBE_COMM_TYPE;
#define MY_DECRIBE_DECLARE_BEGIN(type) static MY_DESCRIBE_COMM_TYPE MY_describe_desc_##type[]={
#define MY_DECRIBE_DECLARE_END {0xffff,"end"} };
#define MY_DECRIBE_ADD_DESC(id,str) {id,#str},
#define MY_DESCRIBE(type,id) get_desc_by_id(MY_describe_desc_##type,id)
char * get_desc_by_id(MY_DESCRIBE_COMM_TYPE *desc,unsigned id)
{
int i=0;
static char no_match[10]={0};
while(desc[i].id!=0xffff)
{
if(desc[i].id==id)
return desc[i].desc;
i++;
}
return "can't find the id";
}
typedef enum
{
apple,
pear,
banana,
}fruit;
typedef enum
{
error_reason1,
error_reason2,
error_reason3
}error_reason;
MY_DECRIBE_DECLARE_BEGIN(error_reason)
MY_DECRIBE_ADD_DESC(error_reason1,磁盘空间不够) #注意这里的字符串描述不用加 ""
MY_DECRIBE_ADD_DESC(error_reason2,操作太频繁)
MY_DECRIBE_ADD_DESC(error_reason3,系统繁忙)
MY_DECRIBE_DECLARE_END
MY_DECRIBE_DECLARE_BEGIN(fruit)
MY_DECRIBE_ADD_DESC(apple,apple)
MY_DECRIBE_ADD_DESC(pear,pear)
MY_DECRIBE_ADD_DESC(banana,banana)
MY_DECRIBE_DECLARE_END
int main()
{
int a=1;
printf("%s\n",MY_DESCRIBE(fruit,apple));
printf("%s\n",MY_DESCRIBE(error_reason,error_reason2));
printf("%s\n",MY_DESCRIBE(error_reason,5));
return 0;
}
编译运行:
$ gcc decribe.c
jie@jix:~/code/ccode$ a.out
apple
操作太频繁
can't find the id
当新加入一个枚举变量时,只需要添加一组宏就可以轻易实现枚举变量的字符串描述。