连接X宏的多个标记

时间:2016-07-21 10:14:24

标签: c concatenation c-preprocessor x-macros

我第一次尝试使用X宏和预处理器连接。

我已经阅读了很多与预处理器连接有关的SO的其他问题,但还没有能够解决这些问题,或者如何使这些问题适应我的用例。

项目列表是一堆structs的ID号列表,如下所示:

#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

现在我还想初始化每个结构的一个成员等于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表单?

1 个答案:

答案 0 :(得分:2)

据我所知,这应该只是:

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