猴耳环

注册

 

发新话题 回复该主题

用宏定义获取枚举值的字符串 [复制链接]

1#
最近在学习有限状态机的时候,遇到了一个问题,如何获取枚举类型的枚举值对应的字符串?第一反应就是就是创建一个字符串的映射数组。这样做确实能够达到效果,但是始终觉得不太好看。最后终于在StackOverFlow上找到了一个类似的问题,下面我介绍一下最佳答案,代码如下:

代码段一:作为头文件引入公共宏的部分

///enumFactory.h//expansionmacroforenumvaluedefinition#defineENUM_VALUE(name,assign)nameassign,//expansionmacroforenumtostringconversion#defineENUM_CASE(name,assign)casename:return#name;//expansionmacroforstringtoenumconversion#defineENUM_STRCMP(name,assign)if(!strcmp(str,#name))returnname;///declaretheaccessfunctionanddefineenumvalues#defineDECLARE_ENUM(EnumType,ENUM_DEF)\enumEnumType{\ENUM_DEF(ENUM_VALUE)\};\constchar*GetString(EnumTypedummy);\EnumTypeGet##EnumType##Value(constchar*string);\///definetheaccessfunctionnames#defineDEFINE_ENUM(EnumType,ENUM_DEF)\constchar*GetString(EnumTypevalue)\{\switch(value)\{\ENUM_DEF(ENUM_CASE)\default:return"";/*handleinputerror*/\}\}\EnumTypeGet##EnumType##Value(constchar*str)\{\ENUM_DEF(ENUM_STRCMP)\return(EnumType)0;/*handleinputerror*/\}\

代码段二:在使用处的定义

///放在引入的文件中#defineSOME_ENUM(XX)\XX(FirstValue,)\XX(SecondValue,)\XX(SomeOtherValue,=50)\XX(OneMoreValue,=)\DECLARE_ENUM(SomeEnum,SOME_ENUM)DEFINE_ENUM(SomeEnum,SOME_ENUM)

我们在需要使用的文件中引入enumFactory.h文件,并在文件中添加对应的代码段二,就能够在代码中通过枚举值获取对应的字符串或者通过字符串获取对应的枚举值。下面我们来看一下这段宏是如何实现的:

首先,假定我们希望定义一个宏

enumSomeEnum{FirstValue,SecondValue,SomeOtherValue=50,OneMoreValue=,};

大家会发现这个和上面的#defineSOME_ENUM(XX)的内容很相似。实际上我们把SOME_ENUM和ENUM_VALUE这两个宏结合起来SOME_ENUM(ENUM_VALUE),这个时候#defineSOME_ENUM(XX)就展开成了{FirstValue,SecondValue,SomeOtherValue=50,OneMoreValue=}再结合DECLARE_ENUM的定义我们就得到了我们最开始想定义的宏了。

接着实现我们最开始目的不分了,宏DEFINE_ENUM定义了两个函数,一个是GetString(),另一个是GetSomeEnumValue()。这两个函数实现了通过枚举值获取字符串和通过字符串获取枚举值的功能。

预览时标签不可点收录于话题#个上一篇下一篇
分享 转发
TOP
发新话题 回复该主题