2016-07-21 13 views
1

私はXマクロとプリプロセッサ連結を初めて使用しようとしています。Xマクロ用に複数のトークンを連結

私は、プリプロセッサの連結に関してSOに関する他の多くの質問を読んだことがありますが、私の頭の中で私の頭を包み込むことはできませんでした。

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

私はそうのような構造体を宣言することができます:

項目のリストがそうのように、structsの束のためのID番号の一覧です

#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番号と同じに初期化します。

#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を達成することができますか?

答えて

2

は、私の知る限り、それは単純に次のようになります。

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

うわー、それは働きました!これは、私がプリプロセッサの連結について考えていた以上に理解していることを意味します。\ – Toby

+1

@Toby 'foo_42'の代わりに' foo_42'(1つのトークン)を得るためにここにトークンペーストが必要です(2トークン、 。しかし '= 42'は単一のトークンである必要はありません(実際には1つではありません)。トークンを貼り付けることはできません。 – Quentin

+0

ああ、光ります!ありがとう@クエンティン – Toby

関連する問題