您的位置:首页 > 编程语言 > C语言/C++

C语言宏实现枚举变量转为字符串描述

2017-01-08 08:54 691 查看
在工作中,经常需要打印错误码,错误码一般定义为枚举变量或无符号整型,但是在打印时直接打印出一个枚举变量,并不直观:

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
当新加入一个枚举变量时,只需要添加一组宏就可以轻易实现枚举变量的字符串描述。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: