我有这个宏代码,它允许我定义C枚举和使用一个构造的字符串形式的枚举名称列表。它使我不必重复枚举器名称(并且可能会为大型列表引入错误)。
#define ENUM_DEFINITIONS(F) \
F(0, Item1) \
F(5, Item2) \
F(15, Item3) \
...
F(63, ItemN)
then:
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 and LINE宏,但我希望有一个更标准的方法。
也有兴趣了解是否有更好的方法来实现这一目标而无需使用宏。