将宏参数中的序列转换为单独的宏

时间:2013-10-30 11:28:25

标签: c++ qt macros c-preprocessor variadic-macros

如果定义类似于MACRO(name,seq)并且代码如下,如何访问宏中的每个元素:

MACRO("TheName",
   (Elem1)
   (Elem2)
   (Elem3)
)

我想生成下一个代码:

MACRO("TheName",
   ELEMMACRO(Elem1)
   ELEMMACRO(Elem2)
   ELEMMACRO(Elem3)
)

或类似的东西。换句话说,我想分别处理每个参数(我不关心定义,即使它会像

一样
MACRO("TheName",
   Elem1,
   Elem2,
   Elem3
)

可能会有更多元素,可能会更少。我已经尝试__V_ARGS__(我只需要gcc),但我只能复制所有元素,而不是单独处理它们。

我该怎么办?

P.S。由于某些原因,我无法使用Boost。

1 个答案:

答案 0 :(得分:3)

最简单的方法是使用这样的序列迭代(它不需要提升):

#define PRIMITIVE_SEQ_ITERATE(...) __VA_ARGS__ ## _END
#define SEQ_ITERATE(...) PRIMITIVE_SEQ_ITERATE(__VA_ARGS__)

#define MACRO_EACH(seq) SEQ_ITERATE(MACRO_EACH_1 seq) 
#define MACRO_EACH_1(...) ELEMMACRO(__VA_ARGS__) MACRO_EACH_2
#define MACRO_EACH_2(...) ELEMMACRO(__VA_ARGS__) MACRO_EACH_1
#define MACRO_EACH_1_END
#define MACRO_EACH_2_END

对于序列中的每个元素,您将调用ELEMMACRO

MACRO_EACH
(
    (Elem1)
    (Elem2)
    (Elem3)
)

并将扩展到这个:

ELEMMACRO(Elem1)
ELEMMACRO(Elem2)
ELEMMACRO(Elem3)