【发布时间】:2017-07-11 07:30:39
【问题描述】:
我目前正在开发一个包含大量枚举的代码库。需要将enum 值与字符串表示进行转换。为此,有一堆辅助宏对表单上的宏进行操作
#define THINGS_MAP(G, P) \
G(LAMP, P) \
G(DESK, P)
在代码的其他地方,有一些宏大致是这样工作的:
#define MK_ENUM(SYM, P) P##_##SYM,
enum { THINGS_MAP(MK_ENUM, THING) }; /* expands to { THING_LAMP, THING_DESK, } */
我想避免在枚举中更改MK_ENUM 和对THINGS_MAP 的调用。
但是,我现在有一个特别长的enum 列表,我还需要在其中为条目添加一些分类。所以我正在考虑做类似的事情
#define THINGS_PROP_MAP(G, P) \
G(LAMP, WOODEN, P) \
G(DESK, METALIC, P)
但是,由于我所有的辅助宏都需要传递两个参数,而不是三个,我在想是否可以映射某种删除参数的宏。这可能吗?
我正在寻找的是类似的东西:
#define THINGS_PROP_MAP(G, P) \
G(LAMP, WOODEN, P) \
G(DESK, METALIC, P)
/* DROP_PROP should create G(LAMP, P) G(DESK, P) */
#define THINGS_MAP(G, P) DROP_PROP(THINGS_PROP_MAP)
我的一个想法是添加一个额外的转换步骤,但我没有让它发挥作用
#define THINGS_PROP_MAP(G, T, P) \
G(T(LAMP, WOODEN, P)) \
G(T(DESK, METALIC, P))
#define DROP_PROP(SYM, _ , P) SYM, P
#define THING_MAP(G, P) THING_PROP_MAP(G, DROP_PROP, P)
是的,我知道这远远超出了宏滥用等 :-)
【问题讨论】:
-
是否有理由不使用外部脚本生成代码,比如 awk?例如,让定义枚举的头文件包含一个自动生成的头文件。在 Makefile 中实现自动化非常简单。如果您确实有很多枚举或需要大量宏魔术,则在外部生成定义,而不是使用复杂的宏魔术,应该更易于维护。
-
嗯,回想起来,这可能是一个更好的主意:-)。随着时间的推移,代码变得越来越复杂。
标签: c gcc enums c-preprocessor