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

标签 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

最佳答案

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/

相关文章:

objective-c - 具有整数的数组的数组

c - 内核如何知道哪些驱动程序属于哪些外设?

C fread 未获取整个文件

c++ - 我如何根据宏中的类型做出决定?

c - 如何使用宏将字符串转换为变量名?

c - 指向结构的指针在传递给函数时根本不改变

c++ - 做 while(false) 模式

c - 如何使用包含宏名称的字符串获取宏的值?

c++ - C++ 中的预处理器解析

c++ - 相等性的预处理器测试总是评估为真