C/C++可变参数宏展开参数及批量生成代码的解决方案
实现可变参数宏DECLARE_LIST批量生成代码
要实现能接收任意数量参数、生成包含funcA和funcB的代码结构,我们可以利用C/C++预处理器的可变参数宏特性,结合递归展开技巧完成。
完整宏实现(C++20及以上兼容)
// 辅助宏:将单个参数转换为declare调用 #define DECLARE_ITEM(x) declare(x); // 辅助宏:将单个参数转换为load调用 #define LOAD_ITEM(x) load(x); // 递归展开可变参数的核心宏 #define EXPAND(...) __VA_ARGS__ #define FOR_EACH(func, ...) EXPAND(FOR_EACH_HELPER(func, __VA_ARGS__)) #define FOR_EACH_HELPER(func, a, ...) func(a) __VA_OPT__(FOR_EACH(func, __VA_ARGS__)) // 目标宏DECLARE_LIST #define DECLARE_LIST(...) \ void funcA() { \ FOR_EACH(DECLARE_ITEM, __VA_ARGS__) \ } \ \ void funcB() { \ FOR_EACH(LOAD_ITEM, __VA_ARGS__) \ }
工作原理说明
DECLARE_ITEM和LOAD_ITEM:负责将单个参数转换为对应的函数调用语句,比如传入a时,DECLARE_ITEM(a)会展开为declare(a);。FOR_EACH系列宏:实现对可变参数列表的遍历,逐个将参数传入指定的处理宏(DECLARE_ITEM或LOAD_ITEM)。其中__VA_OPT__是C++20引入的特性,用于处理可变参数为空或剩余参数的情况,避免编译错误。DECLARE_LIST:最终将参数列表分别传入FOR_EACH生成funcA和funcB的完整函数体。
示例验证
调用DECLARE_LIST(a)
展开后代码:
void funcA() { declare(a); } void funcB() { load(a); }
调用DECLARE_LIST(a, b, c)
展开后代码:
void funcA() { declare(a); declare(b); declare(c); } void funcB() { load(a); load(b); load(c); }
调用DECLARE_LIST(a, b, c, d)
展开后代码:
void funcA() { declare(a); declare(b); declare(c); declare(d); } void funcB() { load(a); load(b); load(c); load(d); }
兼容旧标准(C11/C14)的替代实现
如果需要兼容C++20之前的标准,可以使用基于逗号陷阱的递归宏(注意:此实现要求参数数量至少为1,若需支持空参数需额外处理):
#define DECLARE_ITEM(x) declare(x); #define LOAD_ITEM(x) load(x); #define FOR_EACH(func, first, ...) \ func(first) \ FOR_EACH_NEXT(func, __VA_ARGS__) #define FOR_EACH_NEXT(func, next, ...) \ func(next) \ FOR_EACH_NEXT(func, __VA_ARGS__) #define FOR_EACH_NEXT(func) #define DECLARE_LIST(...) \ void funcA() { \ FOR_EACH(DECLARE_ITEM, __VA_ARGS__) \ } \ \ void funcB() { \ FOR_EACH(LOAD_ITEM, __VA_ARGS__) \ }
内容的提问来源于stack exchange,提问作者Gapex
相关产品推荐
相关产品推荐

