【发布时间】:2026-01-27 02:25:01
【问题描述】:
考虑以下用户样式x-macro:
#define PRIMES_X(func) \
func(2) \
func(3) \
func(5)
我们可以使用它来重复调用传入的宏func,并使用前三个素数。例如:
#define MAKE_FUNC(num) void foo ## num();
PRIMES_X(MAKE_FUNC)
将声明返回 void 的函数 foo2()、foo3() 和 foo5()。
到目前为止,一切都很好。现在假设我想在 x-macro 本身的定义中使用一个宏作为参数,如下所示:
#define MAX_PRIME 5
#define PRIMES_X(func) \
func(2) \
func(3) \
func(MAX_PRIME)
它不起作用,因为MAKE_FUNC 现在将尝试声明void fooMAX_PRIME(),因为(我想)令牌连接发生而不扩展MAX_PRIME。
我可以解决这个问题,让它像以前一样声明 foo5() 吗?
【问题讨论】:
-
顺便说一句,出于好奇,您打算将 x_macro 与
#undefs 一起使用吗? -
@Yunnosch - 不,我目前不取消定义
MAKE_FUNC之类的东西。用户表单的好处之一。 -
没错。请问您从哪里获得了 x_macros 的 undef-free 版本?我问是因为前段时间我在 * 上声明了这项发明,要求参考任何“以前的艺术”。所以我对你的消息来源很感兴趣,即使这意味着我必须停止声明它。
-
这里是the link。这篇文章不是 Andrei 写的,但请看底部的评论:当然,您可能已经在使用名为 X 的宏或变量,而 X 是硬编码在宏体中的。 Andrei Alexandrescu 建议进行以下改进,其中 X 宏本身就是一个参数...,但除此之外没有参考线索。评论线程也很有趣,人们指出 x-macros 有时会丢失。我认为他们至少是半主流的,因为他们有一个*页面......@Yunnosch
-
谢谢,以后再研究。
标签: c c-preprocessor x-macros