You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++如何通过__VA_OPT__实现嵌套场景下的递归宏展开

问题原因

宏仅展开一层是因为你只在FOR_EACH_R入口对第一层调用做了展开,内层递归生成的FOR_EACH_HELPER_R调用没有被纳入展开流程。C/C++宏的重展开规则会标记已展开过的宏名,不会在同一展开上下文中重复处理,因此递归调用无法自动向下执行。

修改后完整代码

#define PARENS ()

#define EXPAND(...) EXPAND4(EXPAND4(EXPAND4(EXPAND4(__VA_ARGS__))))
#define EXPAND4(...) EXPAND3(EXPAND3(EXPAND3(EXPAND3(__VA_ARGS__))))
#define EXPAND3(...) EXPAND2(EXPAND2(EXPAND2(EXPAND2(__VA_ARGS__))))
#define EXPAND2(...) EXPAND1(EXPAND1(EXPAND1(EXPAND1(__VA_ARGS__))))
#define EXPAND1(...) __VA_ARGS__

#define FOR_EACH_R(func, ...) __VA_OPT__(EXPAND(FOR_EACH_HELPER_R(func, __VA_ARGS__)))
// 核心修改:对内层递归调用包裹EXPAND
#define FOR_EACH_HELPER_R(func, sub, ...) func(__VA_OPT__(EXPAND(FOR_EACH_AGAIN_R PARENS (func, __VA_ARGS__))), sub)
#define FOR_EACH_AGAIN_R() FOR_EACH_HELPER_R

#define MY_FUNC(nested, var) (nested | var)
#define NEST_RECURSIVE(...) FOR_EACH_R(MY_FUNC, __VA_ARGS__)

效果验证

输入NEST_RECURSIVE(A, B, C)时,输出完全符合预期:

((( | C) | B) | A)

原有EXPAND的嵌套层级足够支撑常见长度的参数列表,无需额外调整。


内容的提问来源于stack exchange,提问作者Salvage

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 15:54:03