C++可变参数宏定义语法笔记

1. 基础语法

定义格式:

#define MACRO_NAME(fixed_args, ...) macro_body#define LOG(fmt, ...) printf(fmt, __VA_ARGS__)
LOG("Value: %d, Name: %s", 42, "Alice"); // 展开为 printf("Value: %d, Name: %s", 42, "Alice")

1)… 表示可变参数列表。
2)在宏体中,用 VA_ARGS 展开所有可变参数。

2. 处理空的可变参数

当可变参数为空时,直接使用 __VA_ARGS__ 可能导致语法错误(如尾随逗号)。可通过 ## 运算符优化:

使用 ##__VA_ARGS__

#define LOG(fmt, ...) printf(fmt, ##__VA_ARGS__)
LOG("Hello"); // 展开为 printf("Hello")(无尾随逗号)

## 在可变参数为空时,自动删除前面的逗号。

3. C++20 的 VA_OPT(可选展开)

C++20 引入 __VA_OPT__,可更灵活地控制可变参数的展开:

#define LOG(...) printf("Message: " __VA_ARGS__ __VA_OPT__(,) "\n")

当可变参数非空时,__VA_OPT__(,) 展开为 ,;为空时则不展开。

LOG("Error: %d", 404); // 展开为 printf("Message: " "Error: %d", 404 "\n")
LOG();                 // 展开为 printf("Message: " "\n")

4. 示例

(1) 调试日志

#define DEBUG(...) fprintf(stderr, "[DEBUG] " __VA_ARGS__)
DEBUG("File: %s, Line: %d\n", __FILE__, __LINE__);

(2) 泛型包装

#define CALL_FUNC(func, ...) func(__VA_ARGS__)
CALL_FUNC(printf, "Answer: %d", 42); // 展开为 printf("Answer: %d", 42)

(3) 条件编译

#ifdef VERBOSE#define LOG(...) printf(__VA_ARGS__)
#else#define LOG(...) (void)0
#endif

5. 注意事项

  1. 参数中的逗号:
    若参数包含未保护的逗号(如模板类型),需用括号包裹:
LOG("Types: %s", (std::vector<int>, std::map<std::string, float>));
  1. 兼容性:
    ##__VA_ARGS__是 GNU 扩展,但主流编译器(GCC、Clang、MSVC)均支持。
    __VA_OPT__ 是 C++20 标准特性,需编译器支持。

  2. 避免副作用:
    宏展开可能导致多次参数求值:

#define SQUARE_SUM(x, ...) ((x)*(x) + SQUARE_SUM(__VA_ARGS__))
// 错误:递归展开可能导致无限循环
#include <cstdio>// 可变参数宏:支持格式化字符串和可变参数
#define LOG(fmt, ...) printf("[INFO] " fmt "\n", ##__VA_ARGS__)int main() {LOG("Start");              // 输出: [INFO] StartLOG("Sum: %d", 3 + 5);     // 输出: [INFO] Sum: 8return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/news/907012.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mongodb安装启动

这里写自定义目录标题 安装包下载安装后文件目录列表bin目录下 mongod 可以对mongodb 进行启动等操作 环境变量配置创建数据目录&#xff0c;日志目录启动参数配置启动 mongodbweb页面访问&#xff0c;检查服务启动是否正常可视化工具连接mongodb创建 database创建collection查…

Leetcode 3562. Maximum Profit from Trading Stocks with Discounts

Leetcode 3562. Maximum Profit from Trading Stocks with Discounts 1. 解题思路2. 代码实现 题目链接&#xff1a;3562. Maximum Profit from Trading Stocks with Discounts 1. 解题思路 这一题没有搞定&#xff0c;思路上整体走偏了&#xff0c;看了一下别人的解答&…

【Redis】第2节|Redis基本数据类型

一、基础数据结构 1. String&#xff08;字符串&#xff09; 特点&#xff1a;二进制安全&#xff0c;支持字符串、数值存储&#xff0c;原子性操作。核心操作&#xff1a; SET key value # 存储键值对 GET key # 获取值 INCR key # 数值…

用matlab提取abaqus odb文件中的节点信息

在MATLAB中提取Abaqus ODB文件中的节点信息&#xff0c;可以通过以下几种方法实现&#xff1a; 方法1&#xff1a;使用MATLAB的ABAQUS Interface工具箱 https://wenku.csdn.net/answer/77axwtqnys 可以参考这个 MATLAB的ABAQUS Interface工具箱提供了直接读取ODB文件的功能。…

【Java】异常处理

1.异常的概念 在程序运行时&#xff0c;打断正常程序流程的不正常情况分两类: 1.错误(Error)&#xff1a;应用程序无法捕获的严重问题(自己无法处理) 例&#xff1a; 虚拟机相关的问题&#xff0c;如虚拟机崩溃、动态链接失败、低层资源错误等 总是不受编译器检查的&#xff0…

Linux(Centos 7.6)命令详解:tar

1.命令作用 命令tar将许多文件一起保存到单个磁带或磁盘存档中&#xff0c;并且可以从存档中恢复单个文件(GNU tar saves many files together into a single tape or disk archive, and can restore individual files from the archive.)。 2.命令语法 Usage: tar [OPTION.…

企业网络综合实训

企业网络综合实训 任务描述&#xff1a; 公司的中心机房、办公区一和办公区二位于同一园区。要求各大楼之间要互通&#xff0c;并且均能访问Internet&#xff1b;同时公司业务需要对外拓展&#xff0c;需要在Internet数据中心机房部署一台对外提供DNS和Web站点服务的服务器。…

8天Python从入门到精通【itheima】-41~44

目录 41节-while循环的嵌套应用 1.学习目标 2.while循环的伪代码和生活情境中的应用 3.图片应用的代码案例 4.代码实例【Patrick自己亲手写的】&#xff1a; 5.whlie嵌套循环的注意点 6.小节总结 42节-while循环的嵌套案例-九九乘法表 1.补充知识-print的不换行 2.补充…

探索Linux互斥:线程安全与资源共享

个人主页&#xff1a;chian-ocean 文章专栏-Linux 前言&#xff1a; 互斥是并发编程中避免竞争条件和保护共享资源的核心技术。通过使用锁或信号量等机制&#xff0c;能够确保多线程或多进程环境下对共享资源的安全访问&#xff0c;避免数据不一致、死锁等问题。 竞争条件 竞…

《Stable Diffusion 3.0企业级落地指南》——技术赋能与商业价值的深度融合实践

Stable Diffusion 3.0&#xff08;SD3&#xff09;作为当前多模态生成式AI技术的集大成者&#xff0c;凭借其创新的扩散Transformer架构&#xff08;DiT&#xff09;、流匹配&#xff08;Flow Matching&#xff09;技术以及超分辨率生成能力&#xff0c;正在重塑企业内容生产的…

基于本地模型+多级校验设计的高效缓存,有效节省token数量(有点鸡肋doge)。

前言 我是基于token有限而考虑的一个省钱方案&#xff0c;还能够快速返回结果&#xff0c;但是劣势也很明显&#xff0c;设计不好容易出问题&#xff0c;就如下面所介绍的语义飘逸和缓存污染&#xff0c;我认为在自己学习大模型的过程用来省钱非常可以&#xff0c;再加上学习过…

网络安全全知识图谱:威胁、防护、管理与发展趋势详解

1 网络安全基础概念 1.1 什么是网络安全 网络安全是指通过技术、管理和法律等手段&#xff0c;保护计算机网络系统中的硬件、软件及其系统中的数据&#xff0c;不因偶然的或者恶意的原因而遭受到破坏、更改、泄露&#xff0c;确保系统连续可靠正常地运行&#xff0c;网络服务不…

远控安全进阶之战:TeamViewer/ToDesk/向日葵设备安全策略对比

【作者主页】Francek Chen 【文章摘要】在数字化时代&#xff0c;卓越的远程控制软件需兼顾功能与体验&#xff0c;包括流畅连接、高清画质、低门槛UI设计、毫秒级延迟及多功能性&#xff0c;同时要有独树一帜的远控安全技术&#xff0c;通过前瞻性安全策略阻挡网络风险&#x…

Steam发布游戏过程的若干问题

我没有想到在Steam发布游戏的过程会比做游戏的过程更困难&#xff0c;更恶心。 注册Steamworks 税务采访 税务采访部分填的地址要和后面它们要求你发证件照片里的地址一样。护照里因为没有地址不会通过&#xff0c;我用的驾照里面有地址。没有驾照可以用身份证。 应用准备界…

开搞:第四个微信小程序:图上县志

原因&#xff1a;我换了一个微信号来搞&#xff0c;因为用同一个用户&#xff0c;备案只能一个个的来。这样不行。所以我换了一个。原来注册过小程序。现在修改即可。注意做好计划后&#xff0c;速度备案和审核&#xff0c;不然你时间浪费不起。30元花起。 结构&#xff1a; -…

第三十七天打卡

知识点回顾&#xff1a; 过拟合的判断&#xff1a;测试集和训练集同步打印指标模型的保存和加载 仅保存权重保存权重和模型保存全部信息checkpoint&#xff0c;还包含训练状态 早停策略 作业&#xff1a;对信贷数据集训练后保存权重&#xff0c;加载权重后继续训练50轮&#x…

Java高频面试之并发编程-21

hello啊&#xff0c;各位观众姥爷们&#xff01;&#xff01;&#xff01;本baby今天又来报道了&#xff01;哈哈哈哈哈嗝&#x1f436; 面试官&#xff1a;详细说说AQS AQS&#xff08;AbstractQueuedSynchronizer&#xff09;是 Java 并发包&#xff08;java.util.concurre…

按键状态机

原工程地址&#xff1a;https://github.com/candylife9/state_machine_example 视频&#xff1a;C语言之状态机编程_02_状态机使用案例分析_哔哩哔哩_bilibili 我觉得讲的挺好的。 来自豆包封装的通用接口 头文件 /*** file key_state_machine.h* brief 通用按键状态机接口…

华为OD机试真题——新学校选址(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现

2025 A卷 100分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分…

欧拉操作系统下安装hadoop集群

背景&#xff1a;欧拉操作系统下安装CDH集群的时候&#xff0c;需要安装python2.7.5&#xff0c;但是本身欧拉系统对python2的支持可能没有那么好&#xff0c;所以考虑搭建原生的hadoop集群。 基础环境如下 组件名称组件版本欧拉VERSION“22.03 (LTS-SP4)”jdkopenjdk versio…