亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

C語言自動生成enum值和名字映射代碼

2020-01-26 14:47:39
字體:
來源:轉載
供稿:網友

這年頭好像繼續做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*/
/*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 <string.h>#include <stdio.h>#include <stdlib.h>#include "zAutoCodeApi.h"#ifndef ENUM_PRIMARY_FUNCTIONSstatic char *zEnum2Name(dword_t e, zEnum2NameMap_t arr[], int nSize){ int i; for(i=0; i<nSize; i++) {  if(arr[i].e == e) return arr[i].name; }  return 0;}static int zName2Enum(char* name, zEnum2NameMap_t arr[], int nSize, int bAppro){ int i; for(i=0; i<nSize; i++) {  if(bAppro)  {   if(strcasestr(arr[i].name, name)) return arr[i].e;  }  else  {   if(!strcmp(arr[i].name, name)) return arr[i].e;  } }  return -1;}static int zEnumMapShow(zEnum2NameMap_t arr[], int nSize){ int i; for(i=0; i<nSize; i++) {  printf("%3d %d-> %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));};

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。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中文字幕日韩专区| 久久91精品国产91久久跳| 一区二区三区四区视频| 日韩精品极品视频免费观看| 国产成人一区二| 久久99久久99精品免观看粉嫩| 色婷婷综合成人| 最近中文字幕日韩精品| 精品久久久久久中文字幕大豆网| 国产精品视频一| 日韩在线高清视频| 亚洲sss综合天堂久久| 亚洲аv电影天堂网| 91大神福利视频在线| 国产精品免费一区豆花| 亚洲在线免费观看| 亚洲精品少妇网址| 亚洲精品在线不卡| 亚洲第一精品久久忘忧草社区| 亚洲精品午夜精品| 久久影视免费观看| 这里只有精品久久| 色噜噜国产精品视频一区二区| 久99九色视频在线观看| 懂色av中文一区二区三区天美| 国产亚洲精品成人av久久ww| 欧美一级淫片丝袜脚交| 8050国产精品久久久久久| 欧美老少做受xxxx高潮| 日韩成人在线网站| 亚洲午夜av电影| 欧美高清性猛交| 亚洲黄色片网站| 欧美日韩亚洲成人| 日韩精品999| 国产精品99久久久久久久久| 91成人国产在线观看| 两个人的视频www国产精品| 欧美最猛黑人xxxx黑人猛叫黄| 性色av一区二区三区免费| 97婷婷涩涩精品一区| 国产精品自拍视频| 丝袜美腿亚洲一区二区| 午夜精品久久久久久久男人的天堂| 国产精品第一页在线| 亚洲人成毛片在线播放| 日韩精品在线免费| 国产亚洲a∨片在线观看| 人体精品一二三区| 日韩在线视频网站| 日韩在线不卡视频| 成人福利网站在线观看11| 精品一区电影国产| 国产精品嫩草影院久久久| 亚洲欧美成人在线| 国产精品欧美激情| 欧美日韩国产页| 欧美第一黄网免费网站| 91精品国产一区| 国产精品一区=区| 最新的欧美黄色| 国产成人av网址| 在线观看成人黄色| 91精品国产综合久久香蕉的用户体验| 亚洲91av视频| 日韩激情片免费| 亚洲精品久久久一区二区三区| 成人两性免费视频| 色悠悠久久久久| 九九精品在线观看| 久久国内精品一国内精品| 午夜精品一区二区三区在线播放| 国产91精品青草社区| 国产在线精品成人一区二区三区| 久久久久成人网| 日韩av综合网站| 在线看日韩欧美| 国产精品一区二区久久精品| 欧美成人免费一级人片100| 国产精品十八以下禁看| 97超碰色婷婷| 夜夜嗨av一区二区三区四区| 成人在线免费观看视视频| 国产一区二区激情| 亚洲一区二区自拍| 97色在线观看| 亚洲第一区第二区| 欧美激情亚洲另类| 亚洲精品欧美日韩| 高清欧美性猛交xxxx黑人猛交| 日韩高清免费观看| 亚洲国产精品中文| 久久久久久久久爱| 4388成人网| 欧美超级免费视 在线| 国产在线不卡精品| 78m国产成人精品视频| 欧美三级免费观看| 国内精品美女av在线播放| 国产精品扒开腿爽爽爽视频| 久久午夜a级毛片| 亚洲欧美激情在线视频| 欧美xxxx18国产| 成人中文字幕+乱码+中文字幕| 欧美极品第一页| 国语对白做受69| 亚洲精品国精品久久99热| 在线观看欧美www| 国产一区二区三区在线| 日韩在线免费观看视频| 亚洲电影免费观看高清完整版在线| 亚洲自拍偷拍色图| 91精品国产91久久久久福利| 国a精品视频大全| 精品久久久av| 国产精品久久久久久久久久久久久久| 国产成人高清激情视频在线观看| 欧美成人午夜剧场免费观看| 久久视频在线播放| 国产欧美一区二区白浆黑人| 狠狠色香婷婷久久亚洲精品| 国产精品国产福利国产秒拍| 成人黄色午夜影院| 欧美精品一区三区| 亚洲人成绝费网站色www| 国产日韩欧美中文在线播放| 孩xxxx性bbbb欧美| 成人免费高清完整版在线观看| 亚洲a区在线视频| 中文字幕欧美专区| 亚洲一区二区三区毛片| 欧美久久精品午夜青青大伊人| 欧美激情日韩图片| 亚洲tv在线观看| 国产成人亚洲综合| 久久久久久久爱| 91超碰中文字幕久久精品| 成人免费xxxxx在线观看| 97国产真实伦对白精彩视频8| 成人美女免费网站视频| 在线成人一区二区| 国产精品色视频| 欧美电影免费看| 成人午夜激情网| 日韩在线免费视频观看| 深夜福利一区二区| 欧美成人手机在线| 亚洲自拍偷拍色片视频| 欧美疯狂性受xxxxx另类| 日韩毛片中文字幕| 亚洲午夜未删减在线观看| 丝袜情趣国产精品| 91九色综合久久| 亚洲人成欧美中文字幕| 午夜免费久久久久| 91性高湖久久久久久久久_久久99| 久久综合九色九九| 啊v视频在线一区二区三区| 91久久精品美女| 日韩极品精品视频免费观看| 热久久这里只有精品| 亚洲在线视频福利| 中文字幕在线成人| 亚洲成人免费网站|