为什么嵌套的宏没有展开?

Why is the nested macro not unfolded?

我在 gcc-9.3.1 下使用嵌套宏。

这是代码。

#define A(_name) _name, _name, _name

#define P(_1, _2, _name, ...) _name

#define B(...) P(__VA_ARGS__, A(something))(__VA_ARGS__)

B(k)

我希望B(k)先转换为P(k, something, something, something)(k),然后再转换为something(k)

但是,编译器告诉我P的两个参数太少,这意味着A(something)没有展开。

这是为什么?我怎样才能让它展开?

B(k) 扩展为 P(k, A(something))(k) 然后进行递归扩展。它首先找到的是 P,它没有足够的参数。

如果你想让它按照我想的那样工作,你需要安排 AP 之前展开。您可以通过添加显式间接 EXPAND 宏来做到这一点:

#define EXPAND(...)   __VA_ARGS__

#define B(...) EXPAND(P EXPAND((__VA_ARGS__, A(something))))(__VA_ARGS__)

这样,P 不会被识别为宏(没有后面的 (),直到内部 EXPAND 展开(这也会展开 A)。您需要外部 EXPAND 才能在之后显式扩展 P