提问人:Alex Shpilkin 提问时间:3/18/2023 更新时间:3/18/2023 访问量:161
X-宏列表与自身的笛卡尔积
Cartesian product of X-macro list with itself
问:
假设,在 C 中,我有一个使用 X-macros 指定的事物列表。例如
#define TYPES(X, ...) \
X(__VA_ARGS__, i, int) \
X(__VA_ARGS__, j, unsigned int) \
X(__VA_ARGS__, l, long) \
X(__VA_ARGS__, m, unsigned long)
如果我添加该宏的第二个副本(调用它),则为列表中的每对内容生成一些代码并不难;例如:TYPES_
#define TYPES_(X, ...) \
X(__VA_ARGS__, i, int) \
X(__VA_ARGS__, j, unsigned int) \
X(__VA_ARGS__, l, long) \
X(__VA_ARGS__, m, unsigned long)
#define CAST(FROMCH, FROMTY, TOCH, TOTY) \
TOTY FROMCH ## to ## TOCH (FROMTY x) { return (TOTY)x; }
TYPES_(TYPES, CAST)
但是,如果我使用而不是重复,则此代码将不起作用,因为(我认为?)顶级扩展然后包含自身的出现,不允许进一步扩展。TYPES
TYPES_
TYPES
TYPES
有没有办法说服 C 预处理器为列表的笛卡尔乘积生成代码,就像这里一样,而无需指定列表两次?混沌/秩序 pp 式的疯狂可能是可能的,它通过十亿个类似笑声的黑客完成了很多扩展,但我宁愿不诉诸于此。
答:
4赞
ecatmur
3/18/2023
#1
您可以使用宏来执行延迟扩展。相当笨拙:EXPAND
#define EXPAND(X) X
#define TYPES1() TYPES
#define TYPES2(...) TYPES1 EXPAND(())(__VA_ARGS__)
EXPAND(TYPES(TYPES2, CAST))
演示。
评论