VA_ARGS
C++宏可变参数:两种核心写法速览
在封装日志、断言或工具宏时,__VA_ARGS__是必备技能。根据是否包含"固定参数",主要分为两种写法。
写法一:固定参数+可变参数(最常用)
场景 :类似printf,需要先传一个格式字符串,后面跟不定数量的参数。
定义:
cpp
// fmt是固定参数,...是可变参数
#define LOG(fmt, ...) printf(fmt, ##__VA_ARGS__)
用法:
cpp
LOG("错误码: %d", 404);
// 展开为:printf("错误码: %d", 404);
写法二:纯可变参数(无固定参数)
场景 :不需要前缀,直接把传入的一整段代码 原样输出,常用于代码包裹或添加分号。
定义:
cpp
// 只有...,没有固定参数
#define checkKernel(...) __VA_ARGS__
用法:
cpp
// 传入复杂的函数调用
checkKernel(myFunc<<<1,1>>>(a, b));
// 展开为:myFunc<<<1,1>>>(a, b);
避坑指南:处理空参数
如果可变参数可能为空(例如LOG("纯文本")),直接写__VA_ARGS__可能会因为多出一个逗号报错。
解决方案 :使用##__VA_ARGS__。当参数为空时,##会自动把前面的逗号"吃掉",避免语法错误。