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

相关推荐
米码收割机11 小时前
【项目】spring boot+vue3 宠物领养系统(源码+文档)【独一无二】
java·spring boot·宠物
海绵天哥11 小时前
LeetCode Hot 100 | 链表(下)· 分组翻转与设计(C++ 题解)
c++·leetcode·链表
choumin11 小时前
行为型模式——中介者模式
c++·设计模式·中介者模式·行为型模式
会编程的土豆12 小时前
GoWeb 处理请求详解:请求行、请求头、请求参数与给客户端响应
开发语言·http·golang
刹那芳华199213 小时前
STMF+ESP-S+MQTT协议连接华为云端(附踩坑记录)
java·struts·华为
就改了17 小时前
Java8 日期处理(详细版)
java·python·算法
麻瓜生活睁不开眼18 小时前
Android16定制SearchLauncher新增投屏Cast桌面快捷图标完整实现
java·launcher·aosp16
IT小盘20 小时前
12-Prompt不等于一句话-System-User-Context三层结构
java·windows·prompt
name好难取诶20 小时前
PHP 静态分析工具实战 PHPStan 和 Psalm 完全指南
android·开发语言·php
都叫我大帅哥20 小时前
Spring Data JPA 查询之道:方法命名与示例查询完全指南
java·后端·spring