Concaténer plusieurs jetons pour la macro X

J’essaie d’utiliser des macros X et une concaténation de préprocesseur, les deux pour la première fois, ensemble.

J’ai lu de nombreuses autres questions sur l’object SO concernant la concaténation des préprocesseurs, mais je n’ai pas encore été en mesure de les comprendre ou de les adapter à mon cas d’utilisation.

La liste d’éléments est une liste de numéros d’identification pour un ensemble de structs , comme ceci:

 #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) 

Je peux déclarer les structs comme suit:

 #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 

Maintenant, j’aimerais également initialiser l’un des membres de chaque structure pour qu’il soit égal au numéro d’identification, tel que foo_n.id = n; . J’ai pu réaliser la première concaténation de jetons en utilisant les éléments suivants:

 #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) 

Mais je n’ai pas été en mesure de comprendre comment développer correctement l’idée de manière à ce que la valeur atsortingbuée soit également remplacée. J’ai essayé:

 #define X(id_num) foo_## id_num .id = ## id_num ; LIST_OF_ID_NUMS #undef X // Does NOT give: 'foo_n.id = n;' :( 

Et diverses tentatives d’utilisation de la double indirection pour la concaténation. Mais n’ont pas réussi. La tentative ci-dessus, LIST_OF_ID_NUMS les erreurs suivantes pour chaque élément de la liste 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 

Comment puis-je obtenir au mieux la forme foo_n.id = n ?

Autant que je sache, cela devrait simplement être:

 #define X(id_num) foo_## id_num .id = id_num ;