博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C代码工具--自动生成enum值和名字映射代码
阅读量:6577 次
发布时间:2019-06-24

本文共 3232 字,大约阅读时间需要 10 分钟。

这年头好像继续做C语言的人不多了,年轻人大多去互联网和移动应用。确实,那两个领域现在来钱快,且总是供不应求。就说刚刚在一个旧同事的微信群里,有人刚放出自己有团队可以做App几分钟,哇塞,好几个人说有项目,要求加好友私聊。我也想过转行,可惜人老珠黄,没有互联网或是应用团队愿意接收。估计再过些年,C程序世界里就只有我这样的小老头们继续自娱自乐了,羡慕死年轻人了!

平常工作中,经常要做一些打印,或是日志。而这里面,enum类型的数据就很多,如果只是打印出它的整数值,显然会让测试人员很恼火,鬼知道那数字说的是什么。就算你给他个文档对着看,也丝毫不能得到原谅。最后,都得乖乖的把这个enum对应的名字打印出来才能平息。

今天说的这个,就是帮忙搞定这个转换问题的。

比如,有这么个example.h文件:

enum InfoStateE{  eInfoStateIdle,  eInfoStateIniting,  eInfoStateInited,  eInfoStateReady,  eInfoStateActive,  eInfoStateStandby,  eInfoStateRelease,};

我们需要个函数,把enum值翻译成字符串;另外也要个函数,能查找字符串对应的enum值;可以提供名字的一部分。p_enum.pl就是做这个的,只需要执行:

perl p_enum.pl example.h -o:example_map

p_enum.pl接受目录,通配符,或是多个文件。-o:example_map是指定输出的文件名。这里我们得到了example_map.h和example_map.c两个文件:

/*FILE: example_map.hThis file was created at Fri Dec 11 16:40:56 CST 2015Auto-generated source. Don't change it manually.Contact with hhao020@gmail.com for bug reporting and supporting.*/#ifndef EXAMPLE_MAP#define EXAMPLE_MAP#ifdef __cplusplus    extern "C" {#endif#include "zType_Def.h"extern const char* InfoStateE2Name(dword_t e);extern dword_t InfoStateE2Value(char* name, int bAppro);extern int InfoStateEMapShow();#ifdef __cplusplus}#endif#endif /*EXAMPLE_MAP*/
View Code
/*FILE: example_map.cThis file was created at Fri Dec 11 16:40:56 CST 2015Auto-generated source. Don't change it manually.Contact with hhao020@gmail.com for bug reporting and supporting.*/#define _GNU_SOURCE #include 
#include
#include
#include "zAutoCodeApi.h"#ifndef ENUM_PRIMARY_FUNCTIONSstatic char *zEnum2Name(dword_t e, zEnum2NameMap_t arr[], int nSize){ int i; for(i=0; i
%s \n", i, arr[i].e, arr[i].name); } return 0;}#endif /*ENUM_PRIMARY_FUNCTIONS*/#include "example_map.h"#include "example.h"zEnum2NameMap_t InfoStateE_map_t[]={ {eInfoStateIdle, "eInfoStateIdle"}, {eInfoStateIniting, "eInfoStateIniting"}, {eInfoStateInited, "eInfoStateInited"}, {eInfoStateReady, "eInfoStateReady"}, {eInfoStateActive, "eInfoStateActive"}, {eInfoStateStandby, "eInfoStateStandby"}, {eInfoStateRelease, "eInfoStateRelease"},}; /*InfoStateE_map_t*/const char* InfoStateE2Name(dword_t e){ char* pName = zEnum2Name(e, InfoStateE_map_t, TBL_SIZE(InfoStateE_map_t)); if(pName) return pName; return "*NA*";}dword_t InfoStateE2Value(char* name, int bAppro){ return zName2Enum(name, InfoStateE_map_t, TBL_SIZE(InfoStateE_map_t), bAppro);};int InfoStateEMapShow(){ return zEnumMapShow(InfoStateE_map_t, TBL_SIZE(InfoStateE_map_t));};
View Code

p_enum.pl是用了我自己做的lex和yacc库。本来是学习编译原理时的一些实验代码,后来发现它对于文本提取还是很强大,于是有了enum相关的自动生成工具。有兴趣的,可以参考,或者有问题留言。

嗯,还有一点,p_enum.pl不支持enum定义里包含编译控制宏。如果你有这个需求,需要自己修改enum.lex和enum.yacc文件来支持。我非常厌恶编译宏,因此不会做这个更新。

如何设置使用环境的补充说明:

linux环境,perl_zlib建议解压在你的home目录下。然后在你的用户配置文件.bashrc(或是.profile,不同linux略有差别)里面添加zlib的路径。我的配置里是这样的:
export PATH="$HOME/perl/Debug:$PATH"
export PERL5LIB="$HOME/perl/zLib:$HOME/perl5/lib/perl5"
PERL_MB_OPT="--install_base \"$HOME/perl5\""; export PERL_MB_OPT;
PERL_MM_OPT="INSTALL_BASE=$HOME/perl5"; export PERL_MM_OPT;
这当中只有PERL5LIB里的zLib路径是必须的。perl5是我用来装额外的perl库用的,一起贴出来供参考。

windows环境,需要先运行zlib.bat来设置环境变量,然后才能运行p_enum.pl。当然,你还要确认安装了activeperl。

转载于:https://www.cnblogs.com/hhao020/p/5044159.html

你可能感兴趣的文章
中台之上(五):业务架构和中台的难点,都是需要反复锤炼出标准模型
查看>>
使用模板将Web服务的结果转换为标记语言
查看>>
inno setup 打包脚本学习
查看>>
php 并发控制中的独占锁
查看>>
从pandas到geopandas
查看>>
如何在 Swift 中进行错误处理
查看>>
[Leetcode] Factor Combinations 因数组合
查看>>
APM终端用户体验监控分析(下)
查看>>
React Native 0.20官方入门教程
查看>>
JSON for Modern C++ 3.6.0 发布
查看>>
Tomcat9.0部署iot.war(环境mysql8.0,centos7.2)
查看>>
我的友情链接
查看>>
Oracle 服务作用
查看>>
监听在微信中打开页面时的自带返回按钮事件
查看>>
第一个php页面
查看>>
世界各国EMC认证大全
查看>>
LVS DR模型详解
查看>>
Lua基础之coroutine(协程)
查看>>
最优化问题中黄金分割法的代码
查看>>
在JS中使用Ajax
查看>>