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
相关产品推荐
相关产品推荐

