c++总结

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__。当参数为空时,##会自动把前面的逗号"吃掉",避免语法错误。

相关推荐
朝朝辞暮i6 分钟前
C++ 第 15 课:指针 * 和地址 &
开发语言·c++
蜗牛互联网8 分钟前
GPT-6.1 Sol迁移指南:从token单价转向每任务成本门禁
java·人工智能·后端·gpt
奶茶树9 分钟前
【C++】14. C++11新特性【下】
开发语言·c++
web打印社区11 分钟前
汽修 / 4S 店:维修工单、结算单网页怎么静默出纸
开发语言·前端·javascript·chrome·ecmascript
蜗牛互联网14 分钟前
HSTU在Dynamo-Triton中的AOTI与KV缓存验收方法
java·人工智能·后端·缓存
Sirens.15 分钟前
Java多线程实例:单例模式、阻塞队列、线程池与定时器
java·开发语言·单例模式
青山木17 分钟前
秒杀系统设计(一):需求拆解与流量治理
java·数据库·redis·后端·架构
牢姐与蒯24 分钟前
c++加餐之位图
c++·算法·哈希
卓怡学长27 分钟前
w195基于ssm“Fitfrend”个性化健身
java·intellij-idea
沫璃染墨29 分钟前
《从零入门Linux系统篇(五十三):线程篇·六——线程互斥详解:从并发问题到mutex互斥锁》
linux·运维·服务器·开发语言·后端·架构·系统架构