我有这段宏代码,它允许我使用一个结构定义 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 宏,但我希望有更标准的方法。
如果不使用宏,是否有更好的方法来实现这一点,也很感兴趣听听。