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

C++宏中如何在__VA_ARGS__为空时返回空字符串

实现方案

你可以通过C++标准语法或者主流编译器的扩展语法实现需求,不需要宏内条件判断,有现成的成熟技巧:

方案1:C++20及以上标准(无编译器依赖,优先推荐)

C++20新增的__VA_OPT__宏专门用于处理可变参数宏的空参数场景,__VA_OPT__(内容)仅当__VA_ARGS__非空时才会展开括号内的内容,配合参数提取宏即可实现需求,兼容字符串常量和char*变量:

// 提取参数列表的第一个参数
#define GET_FIRST_ARG(first, ...) first
#define MyAssert(condition, ...) CallMyAssertFunctionInCpp(condition, GET_FIRST_ARG(__VA_ARGS__ __VA_OPT__(,) ""))

逻辑说明:

  • 当你传入错误信息时:__VA_OPT__(,)会展开为逗号,GET_FIRST_ARG收到的参数是[你传入的错误信息, ""],返回第一个参数即你传入的内容
  • 当你没传入错误信息时:__VA_OPT__(,)不展开,GET_FIRST_ARG收到的参数只有"",返回空字符串

方案2:兼容C++03及更早标准(依赖主流编译器扩展)

如果你的编译环境不支持C++20,可以用GCC、Clang、MSVC都支持的##__VA_ARGS__扩展实现,兼容性覆盖几乎所有仍在使用的编译器版本:

#define GET_FIRST_ARG(first, ...) first
#define MyAssert(condition, ...) CallMyAssertFunctionInCpp(condition, GET_FIRST_ARG(##__VA_ARGS__, ""))

逻辑说明:

  • 当__VA_ARGS__为空时,##会自动吃掉前面的逗号,GET_FIRST_ARG只收到""参数,返回空字符串
  • 当__VA_ARGS__非空时,##无效果,GET_FIRST_ARG返回你传入的错误信息参数

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 15:39:03