У меня есть этот код макроса, который позволяет мне определять и перечисление 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 , но я надеюсь, что есть более стандартный способ.
Также было бы интересно услышать, если есть лучший способ добиться этого без использования макросов.