为什么嵌套的宏没有展开?
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
,它没有足够的参数。
如果你想让它按照我想的那样工作,你需要安排 A
在 P
之前展开。您可以通过添加显式间接 EXPAND
宏来做到这一点:
#define EXPAND(...) __VA_ARGS__
#define B(...) EXPAND(P EXPAND((__VA_ARGS__, A(something))))(__VA_ARGS__)
这样,P
不会被识别为宏(没有后面的 (
),直到内部 EXPAND
展开(这也会展开 A)。您需要外部 EXPAND
才能在之后显式扩展 P
。
我在 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
,它没有足够的参数。
如果你想让它按照我想的那样工作,你需要安排 A
在 P
之前展开。您可以通过添加显式间接 EXPAND
宏来做到这一点:
#define EXPAND(...) __VA_ARGS__
#define B(...) EXPAND(P EXPAND((__VA_ARGS__, A(something))))(__VA_ARGS__)
这样,P
不会被识别为宏(没有后面的 (
),直到内部 EXPAND
展开(这也会展开 A)。您需要外部 EXPAND
才能在之后显式扩展 P
。