Подсчет макросов препроцессора

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

Также было бы интересно узнать, есть ли лучший способ добиться этого без использования макросов.

9
задан Brian Tompsett - 汤莱恩 5 April 2016 в 11:33
поделиться