如何一行代码同时定义枚举类型和相应的字符串?

lliihhaaoo 2012-09-01 06:20:30
如何一行代码同时定义枚举类型和相应的字符串?

如:
MY_ENUM_BEGIN(MyEnum)
MY_ENUM_ENTRY(Item0)
MY_ENUM_ENTRY(Item1)
MY_ENUM_END

展开后为:
enum MyEnum {
Item0,
Item1,
};
const char* MyEnumStrs[] = {
"Item0",
"Item1",
};

不知能否实现?需要用条件编译多次文件包含来实现吗?
...全文
177 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
lliihhaaoo 2012-09-01
  • 打赏
  • 举报
回复
多谢dickbarry!此方法可行。

不过此方法还略有点小瑕疵,就是对待很多元素的大型枚举类型没问题,但随便一个小枚举都要另搞头文件包来包去的,感觉杀鸡用牛刀。不知有没有更简洁轻量的方法。再等一会没有的话就结贴了,dickbarry的方法已经够我用了。
dickbarry 2012-09-01
  • 打赏
  • 举报
回复
另外,.h还要加另外的宏,防止重复包含...
dickbarry 2012-09-01
  • 打赏
  • 举报
回复
我去..下面忘改了


//.h文件中
#ifdef _TYPE_STRING
#define MY_ENUM_BEGIN(MyEnumStrs) const char* #MyYenumStrs[] = {
#define MY_ENUM_ENTRY(x) #x,
#define MY_ENUM_END };
#endif

#ifdef _TYPE_ENUM
#define MY_ENUM_BEGIN(MyEnumStrs) enum MyEnum {
#define MY_ENUM_ENTRY(x) x,
#define MY_ENUM_END };
#endif

MY_ENUM_BEGIN(MyEnum)
MY_ENUM_ENTRY(Item0)
MY_ENUM_ENTRY(Item1)
MY_ENUM_END

//.cpp文件中
#define _TYPE_STRING
#include "*.h"
#undef_TYPE_STRING

#define _TYPE_ENUM
#include "*.h"
#undef _TYPE_ENUM

dickbarry 2012-09-01
  • 打赏
  • 举报
回复

//.h文件中
#ifdef _TYPE_STRING
#define MY_ENUM_STRING(MyEnumStrs) const char* #MyYenumStrs[] = {
#define MY_STRING_ENTY(x) #x,
#define END_ENUM_STRING };
#endif

#ifdef _TYPE_ENUM
#define MY_ENUM_BEGIN(MyEnumStrs) enum MyEnum {
#define MY_ENUM_ENTRY(x) x,
#define MY_ENUM_END };
#endif
//.cpp文件中
#define _TYPE_STRING
#include "*.h"
#undef_TYPE_STRING

#define _TYPE_ENUM
#include "*.h"
#undef _TYPE_ENUM

[Quote=引用 5 楼 的回复:]
引用 3 楼 的回复:
楼主加预编译啊,就能同时控制两个了
用#ifdef 来判断就可以了


我也是这个思路,但具体操作不知啊,还望不吝赐教。
[/Quote]
这样么?

lliihhaaoo 2012-09-01
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
楼主加预编译啊,就能同时控制两个了
用#ifdef 来判断就可以了
[/Quote]

我也是这个思路,但具体操作不知啊,还望不吝赐教。
lliihhaaoo 2012-09-01
  • 打赏
  • 举报
回复
二楼的那个是定死的,我所说的是一条宏能同时声明枚举元素和字符串,这样枚举元素个数就不受限制了,而且将来还可以添加一些扩展的信息,如:
const char* MyEnumStrs[] = {
可改为
const struct
{
char *eleName;
char *eleImg;
int eleData;
}MyEnumInfos[] = {

而条目宏也可以相应的修改为
MY_ENUM_ENTRY(ele, eleName, eleImg, eleData)

我的想法是把所有条目宏放在一个单独头文件中,通过条件编译分别包含2次,第一次生成枚举元素,第二次生成字符串等信息。应该是可行的,但具体就找不到北了,不知哪位大侠有这方面的经验?
傻X 2012-09-01
  • 打赏
  • 举报
回复
楼主加预编译啊,就能同时控制两个了

用#ifdef 来判断就可以了
dickbarry 2012-09-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
宏,#

C/C++ code
#define ENUM_ENTRY(x,y) enum MyEnum {\
x,\
y,\
};\
const char* MyEnumStrs[] = {\
#x,\
#y,\
};
[/Quote]

这样就固定死,不太好...我还是想不出来同时搞两个...

//另外一个...
#define MY_ENUM_STRING(MyEnumStrs) const char* #MyYenumStrs[] = {
#define MY_STRING_ENTY(x) #x,
#define END_ENUM_STRING };

ouyh12345 2012-09-01
  • 打赏
  • 举报
回复
宏,#
#define ENUM_ENTRY(x,y) enum MyEnum {\
x,\
y,\
};\
const char* MyEnumStrs[] = {\
#x,\
#y,\
};

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧