如何让__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
相关产品推荐
相关产品推荐

