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

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__) \
}

工作原理说明

  1. DECLARE_ITEM和LOAD_ITEM:负责将单个参数转换为对应的函数调用语句,比如传入a时,DECLARE_ITEM(a)会展开为declare(a);。
  2. FOR_EACH系列宏:实现对可变参数列表的遍历,逐个将参数传入指定的处理宏(DECLARE_ITEM或LOAD_ITEM)。其中__VA_OPT__是C++20引入的特性,用于处理可变参数为空或剩余参数的情况,避免编译错误。
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 13:33:23