У меня есть этот макрокоманд, который позволяет мне определить как перечисление 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 макро, похожего на ФАЙЛ и ЛИНИИ макросов, но я надеюсь, что есть более стандартный способ.
Был бы также заинтересован в слушании, если есть лучший способ достичь этого, не используя макросы.
Зачем вам нужны как 'enum', так и массив строк? – Philip
Кажется, это очень часто встречается в моей работе. Примером может служить конечный автомат, в котором перечислены состояния, а интерфейсный интерфейс GUI отображает имя текущего состояния. Его удобно определять только один раз и облегчает для других разработчиков, желающих добавить новые состояния. – Eyal