当前位置: 首页 > news >正文

《C++ Primer 第五版》省略符号(...)

在 C 语言里:可变参数函数(printf 风格)

在 C 语言里,省略号 ... 出现在函数参数列表里,表示参数个数不固定

最典型的例子就是 printf

#include <stdio.h>
#include <stdarg.h>void myPrint(const char *fmt, ...) {   // ... 表示不定数量参数va_list args;va_start(args, fmt);while (*fmt) {if (*fmt == 'd') {int i = va_arg(args, int);printf("%d\n", i);}fmt++;}va_end(args);
}int main() {myPrint("ddd", 10, 20, 30);  // 传了三个 intreturn 0;
}

🔑 要点:

  • ... 代表“剩下的参数”

  • 需要 <stdarg.h> 里的宏 (va_list, va_start, va_arg, va_end) 才能取出

  • 缺点:类型不安全,编译器不会检查传入的类型(传错类型可能崩溃)


2️⃣ 在 C++ 语言里:模板参数包(可变参数模板)

C++11 引入了 可变参数模板,也是用 ...
和 C 不同,它是编译期展开,类型安全。

例子:

#include <iostream>
using namespace std;void print() { } // 递归出口template<typename T, typename... Args>
void print(T first, Args... rest) {cout << first << " ";print(rest...);   // 展开递归
}int main() {print(1, 2.5, "hello", 'A');  // 任意类型,安全return 0;
}

输出:

1 2.5 hello A

🔑 要点:

  • typename... Args 定义一个参数包

  • rest... 展开这个参数包

  • 类型安全,编译器会检查每个实参的类型


3️⃣ 在函数调用里:参数包展开

C++ 里 ... 还能用来 展开一组参数

例子:

template<typename... Args>
void call(Args... args) {foo(args...);   // 把参数原样传给 foo
}


4️⃣ 其他用法:折叠表达式(C++17)

C++17 引入了 折叠表达式,简化了可变参数的处理:

template<typename... Args>
int sum(Args... args) {return (args + ...);  // 从左到右展开:((a+b)+c)+d ...
}int main() {cout << sum(1,2,3,4,5) << endl; // 15
}

相比递归调用更优雅。


5️⃣ 总结口诀

  • C 的 ... = “袋子”,丢多少个参数进去都行,但取出来要小心(用 va_arg),类型不安全。

  • C++ 的 ... = “魔法展开符”,可以把一包模板参数展开成一串,既灵活又安全。

  • C++17 之后,还能写折叠表达式,更简洁。


👉 形象比喻:

  • C 的 ... 像是快递袋子,里面放什么快递员不管,你自己拆开得对照单子,不然拆错了就坏了。

  • C++ 的 ... 像是拼装积木,编译器帮你一块块展开拼起来,不会出错。

http://www.dtcms.com/a/349458.html

相关文章:

  • PHP学习笔记1
  • C#——SQLServer数据库入门
  • **FastAPI + Pydantic v2 + JSON‑RPC 2.0**,实现 A2A 规范核心方法
  • 什么是转入原注册商?
  • C++STL---count() 统计容器中特定元素出现次数
  • linux 正则表达式学习
  • 虚拟化技术 ——KVM
  • Redis常规指令及跳表
  • 机器学习--朴素贝叶斯
  • 零基础-动手学深度学习-13.1. 图像增广
  • 使用烛线图展示二进制01离散量趋势图
  • 嵌入式GPIO外设深度技术解析:从基础原理到高级应用
  • 开源 C++ QT Widget 开发(六)通讯--TCP调试
  • 微软恶意软件删除工具:官方免费的系统安全防护利器
  • CentOS安装Jenkins全流程指南
  • 3-1.Python 函数 - 函数基础(函数概述、函数的定义与调用、函数文档)
  • 8.25 朴素贝叶斯
  • [AI] Firebase Studio :AI+云端 IDE
  • C++深度优先搜素
  • 说明哈夫曼树查询过程的例子
  • 基于MATLAB的遥感图像变化检测
  • 嵌入式系统学习Day22(进程)
  • 【React】案例:B站评论
  • C#/.NET/.NET Core技术前沿周刊 | 第 51 期(2025年8.18-8.24)
  • Coze用户账号设置修改用户头像-后端源码
  • 【系统架构设计师】数据库设计(一):数据库技术的发展、数据模型、数据库管理系统、数据库三级模式
  • 容器学习day02
  • [React]Antd Cascader组件地区选择
  • SpringBoot整合Elasticsearch
  • SQL语法指南