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

如何让__VA_OPT__展开,实现带/无参时调用不同C++预处理宏?

解决C++宏根据参数有无调用不同宏的问题

你希望根据宏调用时是否带有参数,调用两个不同的C++预处理宏,编写的代码中__VA_OPT__(_WITH_ARGS)无法正常展开,修正拼写后在MSVC中仍然无法工作:

#define FUN() "call without arguments"
#define FUN_WITH_ARGS(...) "call with arguments"
#define GET_MACRO(b) FUN##b
#define CALL(...) GET_MACRO(__VA_OPT__(_WITH_ARGS))(__VA_ARGS__)

CALL() // --> "call without arguments"
CALL(5) // --> "call with arguments"

解决方案

问题核心是__VA_OPT__的展开时机——直接传递给GET_MACRO时,它不会被优先展开,而是被当作普通标识符处理。需要新增一层中间宏触发__VA_OPT__的展开,修改后的代码如下:

#define FUN() "call without arguments"
#define FUN_WITH_ARGS(...) "call with arguments"
#define GET_MACRO(b) FUN##b
// 新增中间宏,确保__VA_OPT__先完成展开
#define CALL_INNER(b, ...) GET_MACRO(b)(__VA_ARGS__)
#define CALL(...) CALL_INNER(__VA_OPT__(_WITH_ARGS), __VA_ARGS__)

CALL() // 正确展开为 "call without arguments"
CALL(5) // 正确展开为 "call with arguments"

针对MSVC的额外配置

__VA_OPT__是C++20标准引入的特性,需确保MSVC项目开启对应标准支持:

  • 打开项目属性,进入「C/C++」→「语言」选项,将「C++语言标准」设置为ISO C++20 Standard (/std:c++20)或更高版本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 20:42:43