程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C說話主動生成enum值和名字映照代碼

C說話主動生成enum值和名字映照代碼

編輯:關於C++

C說話主動生成enum值和名字映照代碼。本站提示廣大學習愛好者:(C說話主動生成enum值和名字映照代碼)文章只能為提供參考,不一定能成為您想要的結果。以下是C說話主動生成enum值和名字映照代碼正文


這歲首似乎持續做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.h
This file was created at Fri Dec 11 16:40:56 CST 2015

Auto-generated source. Don't change it manually.
Contact with [email protected] 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.c
This file was created at Fri Dec 11 16:40:56 CST 2015

Auto-generated source. Don't change it manually.
Contact with [email protected] for bug reporting and supporting.
*/

#define _GNU_SOURCE 
#include <string.h>
#include <stdio.h>
#include <stdlib.h>


#include "zAutoCodeApi.h"
#ifndef ENUM_PRIMARY_FUNCTIONS
static 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。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved