Объединить несколько токенов для макроса X
Я пытаюсь использовать X-макросы и конкатенацию препроцессора, оба впервые, вместе.
Я прочитал много других вопросов по SO, связанных с конкатенацией препроцессоров, но пока не смог обернуть их вокруг или узнать, как их адаптировать к моему варианту использования.
Список пунктов представляет собой список идентификационных номеров для группы structs
, вот так:
#define LIST_OF_ID_NUMS \
X(1) \
X(2) \
X(3) \
X(4) \
X(5) \
X(6) \
X(7) \
X(8) \
X(9) \
X(10) \
X(11)
Я могу объявить структуры следующим образом:
#define X(id_num) static myFooStruct foo_## id_num ;
LIST_OF_ID_NUMS
#undef X
// gives: 'struct myFooStruct foo_n;' where 'n' is an ID number
Теперь я также хотел бы инициализировать один из членов каждой структуры равным идентификационному номеру, так, чтобы foo_n.id = n;
, Я смог достичь первой конкатенации токенов, используя следующее:
#define X(id_num) foo_## id_num .id = 3 ;
LIST_OF_ID_NUMS
#undef X
// gives: 'foo_n.id = x' where 'x' is some constant (3 in this case)
Но я не смог понять, как правильно расширить идею, чтобы присвоенное значение также было заменено. Я пытался:
#define X(id_num) foo_## id_num .id = ## id_num ;
LIST_OF_ID_NUMS
#undef X
// Does NOT give: 'foo_n.id = n;' :(
И различные попытки использования двойной косвенности для объединения. Но не были успешными. Вышеуказанная попытка приводит к ошибкам, таким как следующие для каждого элемента в LIST_OF_ID_NUMS
:
foo.c:47:40: error: pasting "=" and "1" does not give a valid preprocessing token
#define X(id_num) foo_## id_num .id = ## id_num ;
^
foo.c:10:5: note: in expansion of macro 'X'
X(1) \
^
foo.c:48:2: note: in expansion of macro 'LIST_OF_ID_NUMS '
LIST_OF_ID_NUMS
Как я могу лучше всего достичь формы foo_n.id = n
?
1 ответ
Насколько я могу сказать, это должно быть просто:
#define X(id_num) foo_## id_num .id = id_num ;