- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章C语言自动生成enum值和名字映射代码由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
这年头好像继续做C语言的人不多了,年轻人大多去互联网和移动应用。确实,那两个领域现在来钱快,且总是供不应求。就说刚刚在一个旧同事的微信群里,有人刚放出自己有团队可以做App几分钟,哇塞,好几个人说有项目,要求加好友私聊。我也想过转行,可惜人老珠黄,没有互联网或是应用团队愿意接收。估计再过些年,C程序世界里就只有我这样的小老头们继续自娱自乐了,羡慕死年轻人了! 。
平常工作中,经常要做一些打印,或是日志。而这里面,enum类型的数据就很多,如果只是打印出它的整数值,显然会让测试人员很恼火,鬼知道那数字说的是什么。就算你给他个文档对着看,也丝毫不能得到原谅。最后,都得乖乖的把这个enum对应的名字打印出来才能平息.
今天说的这个,就是帮忙搞定这个转换问题的.
比如,有这么个example.h文件:
1
2
3
4
5
6
7
8
9
|
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两个文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
/*
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 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*/
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
/*
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 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_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*/
|
。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
#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的路径。我的配置里是这样的:
1
2
3
4
|
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.
最后此篇关于C语言自动生成enum值和名字映射代码的文章就讲到这里了,如果你想了解更多关于C语言自动生成enum值和名字映射代码的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我不明白为什么这甚至可以编译。我尝试过不同的格式,它们似乎都有效。 为什么有一个 enum of enum of enum of.. 是合法的? interface I { enum E im
我有大型数据库(数百万行),我正在尝试为 2 个字段的数据类型做出最佳选择。我制作的大部分内容都是 varchar 或 INT。但是,我想知道 Enum 是否是最好的方法的 2 个字段。 字段 1第一
我是 C++ 新手,我想知道是否有人可以帮助我理解原因 enum difficulty { NOVICE, EASY, NORMAL, HARD, UNBEATABLE }; difficulty m
从 native 代码强制转换(在 C++/CLI 中)的正确方法是什么 enum到托管代码enum其中包含相同的 enum值(value)观?与使用 C# 的强制转换方式有什么区别,例如 (int)
我有以下枚举 [Flags] public enum WeekDays { Monday = 1, Tuesday = 2, Wednesday = 4, Thursd
我刚刚学习 Java 中的枚举。当我运行下面的代码时,我收到一个错误,我也在下面重现该错误。基本上,我的问题是:当我在枚举中定义一个方法,并且在该方法中我想检查枚举的值以便我可以根据该值执行某些操作时
我想要一些语法糖来打开 Enum .当然,一个if else块按预期工作: @enum Fruit apple=1 orange=2 kiwi=3 function talk1(fruit::Frui
我试图在 Enum.each 的函数内为变量设置一个值,但在循环结束时,变量为空,我不知道为什么会出现这种行为。 代码: base = "master" candidates = ["stream",
This question already has answers here: Is there a way to use existing structs as enum variants? (2个
我想让 Java 中的枚举器具有其他枚举作为属性。 public enum Direction { Up(Down), Down(Up), Left(Right), R
我有一个包含两种不同可能“类型”的枚举和一个可以返回其中任何一种的函数,封装在 Option 中: enum Possibilities { First(i32), Second(St
我刚刚注意到 pyhton 中 Enum+defaultdict 的一个非常奇怪的行为。我定义了一个这样的枚举,它收集了一些默认词典: from enum import Enum from colle
我想在运行时从配置文件生成一些类型。为简单起见,假设我已经将数据加载为 Python 字典: color_values = dict(RED = 1, YELLOW = 2, GREEN = 3) 我
我想创建一个方法,在传入参数的任何枚举类上实现 valueOf(并包装一些专门的错误/缺失名称代码)。所以基本上,我有几个枚举,例如: enum Enum1{ A, B, C } enum Enum2
我有一个user数据库表: CREATE TABLE IF NOT EXISTS `user` ( `user_id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
这是我的 JPA @Repository,在这里我们可以得到 list与 findByFullNameContaining(String query) - 通过在查询中提供 fullName 的子字符
(也在这里打开了一个问题:https://github.com/square/moshi/issues/768 但被要求打开一个stackoverflow问题)我正在编写一个通用适配器来转换带有枚举值
请帮助找到以下情况的最佳方法: 有一个表,大约有 20 列。 每列都有自己的短名称、全名称和类型(数字或字符串)。 每个列类型都可以有自己的运算符 - 例如,字符串 - 包含、等于;数字 - 更多、更
如果我在 python 中按功能创建了 enum.Enum(本例中为 3.7),如何从中检索类的名称? import enum def print_the_enum_class_name(some_e
我正在编写一个与第 3 方程序交互的程序。这个第 3 方程序允许用户制作可以运行在第 3 方程序中进行的步骤记录的按钮。 但! 这些按钮还可以运行用户定义的批处理文件。因此,我使用此功能通过创建文件并
我是一名优秀的程序员,十分优秀!