我有这样的宏代码,这让我既定义一个ç枚举和使用一种构建串列举名称的列表。它防止我必须重复枚举器名称(并可能为大型列表引入错误)。计数预处理宏
#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'和字符串数组? – Philip 2011-12-29 06:21:24
它似乎在我的工作中很常见。一个例子是枚举状态的状态机,前端GUI显示当前状态的名称。它只需定义一次便于使用,并且使希望添加新状态的其他开发人员更容易。 – Eyal 2011-12-29 18:39:09