使用C预处理器进行嵌套宏迭代

时间:2017-02-10 10:44:37

标签: c macros c-preprocessor metaprogramming

使用C预处理器,您可以拥有某种高阶宏。像这样:

#define ABC(f) f(a) f(b) f(c)
#define XY(f) f(x) f(y)

#define CODE(x) foo_ ## x
ABC(CODE)
#undef CODE

#define CODE(x) bar_ ## x
XY(CODE)
#undef CODE

输出结果为:

 foo_a foo_b foo_c
 bar_x bar_y

是否有一些技巧来嵌套这样的迭代,做这样的事情?

#define CODE(x) foo_ ## x
NEST(ABC, XY, CODE)
#undef CODE

所以输出结果为:

foo_ax foo_ay foo_bx foo_by foo_cx foo_cy

特别是,我希望ABCXY的定义相互独立,这样我仍然可以单独使用ABC或甚至可以做某事像这样:

#define CODE(x) foo_ ## x
NEST(XY, KLMN, ABC, CODE)
#undef CODE

为了记录,这里是解决方案:

#include <boost/preprocessor/seq.hpp>

#define ABC (a) (b) (c)
#define XY (x) (y)

#define CODE(r, prod) BOOST_PP_CAT(foo_, BOOST_PP_SEQ_CAT(prod))
BOOST_PP_SEQ_FOR_EACH_PRODUCT(CODE, (ABC) (XY))

收率:

foo_ax foo_ay foo_bx foo_by foo_cx foo_cy

1 个答案:

答案 0 :(得分:3)

Boost Preprocessor Library提供了几个可以开箱即用的宏。

BOOST_PP_SEQ_FOR_EACH_PRODUCT将迭代两个或多个以(x) (y) (z)形式编码的列表的笛卡尔积(这些列表称为序列是图书馆的用语)。

对于编码为(x, (y, (z, NIL)))的列表,

BOOST_PP_LIST_FOR_EACH_PRODUCT也会这样做。

X macro迭代转换为&#34;序列&#34;这是微不足道的。像这样:

#define LIST_TO_SEQ(X) (X)
ABC(LIST_TO_SEQ)