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

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

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
当新加入一个枚举变量时,只需要添加一组宏就可以轻易实现枚举变量的字符串描述。



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值