Объединить несколько токенов для макроса 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 ;
Другие вопросы по тегам