使用 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
特别是,我希望 ABC
和 XY
的定义相互独立,这样我仍然可以使用 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
最佳答案
Boost Preprocessor Library提供了几个开箱即用的宏。
BOOST_PP_SEQ_FOR_EACH_PRODUCT将迭代以 (x) (y) (z)
形式编码的两个或多个列表的笛卡尔积(图书馆的说法是序列)。
BOOST_PP_LIST_FOR_EACH_PRODUCT将对编码为 (x, (y, (z, NIL)))
的列表执行相同的操作。
转换 X macro 很简单迭代到这样的“序列”:
#define LIST_TO_SEQ(X) (X)
ABC(LIST_TO_SEQ)
关于c - 使用 C 预处理器进行嵌套宏迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42157399/