1

X マクロとプリプロセッサ連結を初めて一緒に使用しようとしています。

プリプロセッサの連結に関連するSOに関する他の多くの質問を読みましたが、まだそれらに頭を悩ませたり、ユースケースにそれらを適応させる方法を理解することができませんでした。

アイテムのリストは、一連の の ID 番号のリストです。次の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

ここで、各構造体のメンバーの 1 つを ID 番号と等しくなるように初期化したいと思います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ますか?

4

1 に答える 1