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
相关产品推荐
相关产品推荐

