【发布时间】:2011-12-28 23:22:12
【问题描述】:
我有这个宏代码,它允许我使用一个构造将 C 枚举和枚举名称列表定义为字符串。它使我不必重复枚举器名称(并可能为大型列表引入错误)。
#define ENUM_DEFINITIONS(F) \
F(0, Item1) \
F(5, Item2) \
F(15, Item3) \
...
F(63, ItemN)
然后:
enum Items {
#define ITEM_ENUM_DEFINE(id, name) name = id,
ENUM_DEFINITIONS(ITEM_ENUM_DEFINE)
#undef ITEM_ENUM_DEFINE
当展开时,应该产生:
enum Items {
Item1 = 0,
Item2 = 5,
Item3 = 15,
...
ItemN = 63,
}
在实现文件中,我有这样的代码:
const char* itemNames[TOTAL_ITEMS];
int iter = 0;
#define ITEM_STRING_DEFINE(id, name) itemNames[iter++] = #name;
ENUM_DEFINITIONS(ITEM_STRING_DEFINE)
#undef ITEM_STRING_DEFINE
当展开时,会产生:
itemNames[iter++] = "Item1";
itemNames[iter++] = "Item2";
itemNames[iter++] = "Item3";
...
itemNames[iter++] = "ItemN";
我想知道我以这种方式创建了多少枚举项,并能够将其传递给编译时数组。在上面的示例中,这将在编译时确定 TOTAL_ITEMS = N。是否可以以这种方式计算宏调用?
我看到有人提到非标准的 COUNTER 宏,类似于 FILE 和 LINE 宏,但我希望还有一种更标准的方法。
也有兴趣了解是否有更好的方法来实现这一点而无需使用宏。
【问题讨论】:
-
为什么需要
enum和字符串数组? -
这似乎在我的工作中经常出现。一个示例是枚举状态的状态机,前端 GUI 显示当前状态的名称。只定义一次很方便,也方便其他希望添加新状态的开发人员。
标签: c macros c-preprocessor