C/C++ 不定参函数
C语言不定参函数
函数用法总结
Va_list
- 作用:类型定义,生命一个变量,该变量被用来访问传递给不定参函数的可变参数列表
- 用法:供后续函数进调用,通过该变量访问参数列表
typedefchar* va_list;
va_start
- 作用:初始化va_list变量,指向可变参数列表中的第一个参数,这个宏需要知道最后一个固定参数的位置,方便从其后开始读取可变参数
- 参数:ap(初始化的va_list变量)、last_artg(确定从哪里开始读取可变参数4)
voidva_start(va_list ap, last_arg);
va_arg
- 作用:va_arg宏用于获取可变参数列表中的下一个参数,并将其转换为指定的类型
- 参数:ap,type指定要获取的参数类型
- 返回值:返回指定类型的下一个参数值,并将va_list 变量指向下一个参数
type va_arg(va_list ap, type);
va_end
- 作用:用于清理va_list变量
- 参数:ap需要清理的va_list变量
voidva_end(va_list ap);
使用事例
使用事例
- 至少定义一个固定参数的函数,然后后面的参数使用... 表示
- va_list args:定义一个变量,用于存储不定参数的列表
- va_start(args, fixeArg):初始化args,并让其指向可变参数列表的开始;fixeArg则是最后一个固定参数,用于确定从哪里开始寻找可变参数
- va_arg(args,int):获取当前参数,类型设置为int,并将指针移动到下一个参数
- va_end(args):清理va_list,结束不定参数的获取
#include<stdarg.h>
#include <stdio.h>
// 定义一个不定参函数
void exampleFunction(int fixedArg, ...)
{
va_list args;
va_start(args, fixedArg);// 获取不定参
int nextArg;
while ((nextArg = va_arg(args, int)) != 0)
{printf("Argument: %d\n", nextArg);
}va_end(args);
}int main()
{exampleFunction(1, 2, 3, 4, 5, 0); // 0作为终止条件return 0;
}
#include<iostream>
#include <cstdarg>
void printNum(int n, ...)
{va_list al;va_start(al, n); // 让al指向n参数之后的第一个可变参数for (int i = 0; i < n; i++) {int num = va_arg(al, int); // 从可变参数中取出一个整形参数std::cout << num << std::endl;}va_end(al); // 清空可变参数列表--其实是将al置空
}int main() {printNum(3, 11, 22, 33); // 输出:11 22 33printNum(5, 44, 55, 66, 77, 88); // 输出:44 55 66 77 88return 0;
}
vasprintf函数
格式化输出写入一个动态分配字符串
- char **strp:指向字符指针的指针,用于接收分配的内存的地址,
vasprintf
会为存储格式化后的字符串动态分配内存,并将其地址存储在*strp
中。调用者需要负责在使用完字符串后使用free()
函数释放这块内存- const char *fmt:这是格式化字符串,类似于
printf
函数中的格式化字符串。它可以包含格式说明符(如%d
,%s
等),并且需要与后续的可变参数相匹配- va_list ap:这是一个
va_list
类型的变量,用于传递可变参数列表。它通常通过va_start
宏初始化返回值
- 成功:返回生成字符串的长度
- 失败:返回-1,同时将*strp设置成NULL
intvasprintf(char **strp, constchar *fmt, va_list ap);
- 函数create_message:初始化变量ap,从fmt之后的参数开始获取可变参数
- vasprintf:根据fmt中的格式化字符串,以及ap生成最终字符串,动态分配内存存储生成的字符串,并将其存储在strp中(将格式化字符格式和可变参数结合,生成固定格式的消息,存储在strp中)
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>int create_message(char **strp, const char *fmt, ...) {va_list ap;va_start(ap, fmt);int result = vasprintf(strp, fmt, ap);va_end(ap);return result;
}int main() {char *message;int length = create_message(&message, "Hello, %s! You have %d new messages.", "Alice", 5);if (length != -1) {printf("Generated string: %s\n", message);printf("String length: %d\n", length);free(message); // 记得释放分配的内存} else {fprintf(stderr, "Memory allocation failed\n");}return 0;
}//
Generated string: Hello, Alice! You have 5 new messages.
String length: 34
C++风格不定参
不定参宏实现日志功能
- 宏定义:#define Log( fmt , ...):定义一个Log宏,该宏接受一个格式化字符串fmt,以及一个可变数量的附加参数
- __FILE__和 __LINE__:预定义宏,当前源文件的文件名和行号
- ##__VA_ARGS:宏的可变参数部分为空的时候,可以自动取出前面的逗号,避免语法错误
#include<iostream>
#include <cstdarg>
#define LOG(fmt, ...) printf("[%s:%d] " fmt "\n", __FILE__, __LINE__, ##__VA_ARGS__)int main()
{LOG("%s-%s", "hello", "世界");LOG("%s-%s", "hello", "中国");return 0;
}
实现C风格的不定参函数
基本与C语言风格相同
#include<iostream>
#include <cstdarg>
void printNumbers(int count, ...)
{va_list args;va_start(args, count); // 初始化 va_list 并将其指向 count 之后的第一个可变参数for (int i = 0; i < count; ++i) {int num = va_arg(args, int); // 逐个获取参数std::cout << num << " ";}va_end(args); // 清理 va_liststd::cout << std::endl;
}int main() {printNumbers(3, 10, 20, 30); // 输出: 10 20 30printNumbers(5, 1, 2, 3, 4, 5); // 输出: 1 2 3 4 5return 0;
}
C++11可变模版
通过递归模版展开
#include<iostream>
void print() {
std::cout << std::endl; // 递归基例:什么都不做,只是结束递归
}template<typename T, typename... Args>void print(T first, Args... args) {std::cout << first << " "; // 打印第一个参数print(args...); // 递归调用 print 处理剩余参数
}int main() {print(1, 2.5, "Hello", 'c'); // 输出: 1 2.5 Hello creturn 0;
}
C++17折叠表达式
#include<iostream>
template<typename... Args>
void print(Args... args) {(std::cout << ... << args) << std::endl; // 使用折叠表达式展开参数包
}int main() {print(1, 2.5, "Hello", 'c'); // 输出: 1 2.5 Hello creturn 0;
}
ofstream
专门用于文件输出操作,就是将数据写入文件。fstream
是 std::basic_ofstream
的一个实例化,std::basic_ofstream
是一个模板类,用于处理各种字符类型的文件输出。ofstream
专门处理 char
类型的文件
基本使用总结
文件打开关闭
- ofstream对象可以利用自身构造或者open方法打开文件,文件只要被打开,程序就可以将数据写入文件
- 程序结束或者该对象销毁的到时候,文件会自动关闭,也可以手动关闭文件,即调用close()方法
std::ofstream file("example.txt");
if (file.is_open()) {// 文件已成功打开,可以进行写入操作
}
写入数据
- 支持向文件写入多种类型的数据
std::ofstream file("example.txt");
if (file.is_open()) {file << "Hello, World!" << std::endl;file << 123 << std::endl;file << 45.67 << std::endl;
}
检查文件状态
- is_open():检查文件是否成功打开
- good():检查文件流是否处于有效状态
- fail:检查是否出现了某种错误
std::ofstream file("example.txt");
if (!file) {std::cerr << "Failed to open the file." << std::endl;
}
文件模式
std::ios::out
:默认模式,表示文件用于写入。std::ios::app
:追加模式,在文件末尾添加内容而不覆盖已有内容。std::ios::trunc
:清空文件内容(默认行为,如果文件已存在)。std::ios::binary
:以二进制模式打开文件,而非文本模式
std::ofstream file("example.txt", std::ios::app);
自动资源管理
- 内部是RAII模式管理文件资源,只要该对象超出作用域,文件就会自动关闭
{std::ofstream file("example.txt");file << "This will be written to the file." << std::endl;
} // file 对象超出作用域,文件自动关闭
ifstream
标准库中的一个类,属于 <fstream>
头文件,它用于文件输入操作,即从文件中读取数据。ifstream
是 std::basic_ifstream
的一个实例化,std::basic_ifstream
是一个模板类,用于处理各种字符类型的文件输入。ifstream
专门处理 char
类型的文件
基本使用总结
文件打开和关闭,与Ofstream相同,构造函数打开,打开后程序可以从文件中读取数据,程序结束或者对象被销毁的时候,文件自动关闭。手动关闭就是close()
std::ifstream file("example.txt");
if (file.is_open()) {// 文件已成功打开,可以进行读取操作
}
读取数据,使用>>提取运算符从文件中读取数据
std::ifstream file("example.txt");
if (file.is_open()) {std::string str;int num;file >> str >> num;std::cout << "Read string: " << str << ", number: " << num << std::endl;
}
检查文件状态,is_open是否成功打开,good()文件流是否处于有效状态,fail检查是否错误
std::ifstream file("example.txt");
if (!file) {std::cerr << "Failed to open the file." << std::endl;
}
文件模式
std::ios::in
:默认模式,表示文件用于读取。std::ios::binary
:以二进制模式打开文件,而非文本模式
std::ifstream file("example.txt", std::ios::binary);
相关文章:

C/C++ 不定参函数
C语言不定参函数 函数用法总结 Va_list 作用:类型定义,生命一个变量,该变量被用来访问传递给不定参函数的可变参数列表用法:供后续函数进调用,通过该变量访问参数列表 typedefchar* va_list; va_start 作用ÿ…...

C语言——函数专题
1.概念 在C语言中引入函数的概念,有些翻译为子程序。C语言中的函数就是一个完成某项特定任务的一小段代码,这个代码是有特殊的写法和调用方法的。一般我们可以分为两种函数:库函数和自定义函数。 2.库函数 C语言国际标准ANSIC规定了一些常…...
springboot打可执行jar包
1. pom文件如下 <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><m…...

【SQL】科目种类
目录 题目 分析 代码 题目 表: Teacher ------------------- | Column Name | Type | ------------------- | teacher_id | int | | subject_id | int | | dept_id | int | ------------------- 在 SQL 中,(subject_id, dept_id) 是该表的主键。 该表…...

【深度学习】【语音】TTS,最新TTS模型概览,扩散模型TTS,MeloTTS、StyleTTS2、Matcha-TTS
文章目录 基础介绍对比基础介绍 MeloTTS: MeloTTS 是 MyShell.ai 开发的一个多语言语音合成模型,支持包括英语、西班牙语、法语、中文、日语和韩语等多种语言。它以高质量的语音合成为特色,尤其擅长处理中英混合内容。该模型优化了在 CPU 上的实时推理能力,使其在多种应用场…...

【论文笔记】LION: Linear Group RNN for 3D Object Detection in Point Clouds
原文链接:https://arxiv.org/abs/2407.18232 简介:Transformer在3D点云感知任务中有二次复杂度,难以进行长距离关系建模。线性RNN则计算复杂度较低,适合进行长距离关系建模。本文提出基于窗口的网络线性组RNN(即对分组…...

打造高可用集群的基石:深度解析Keepalived实践与优化
高可用集群 集群类型 集群类型主要分为负载均衡集群(LB)、高可用集群(HA)和高性能计算集群(HPC)三大类。每种集群类型都有其特定的应用场景和优势。 1. 负载均衡集群(LB) 负载均衡集…...

Web大学生网页作业成品——环保主题介绍网页网站设计与实现(HTML+CSS)(5个页面)
🎉🎉🎉 常见网页设计作业题材有**汽车、环保、明星、文化、国家、抗疫、景点、人物、体育、植物、公益、图书、节日、游戏、商城、旅游、家乡、学校、电影、动漫、非遗、动物、个人、企业、美食、婚纱、其他**等网页设计题目, 可满足大学生网…...

Qt登录窗口设计
widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QIcon> //图标类 #include <QPushButton> #include <QLineEdit> //行编辑 #include <QLabel> #include <QTextEdit> #include <QMovie>class Widge…...

探索数据矿藏:我的AI大模型与数据挖掘实战经验分享
🚀 探索数据矿藏:我的AI大模型与数据挖掘实战经验分享 💖 前言:数据的金矿,AI的翅膀 在人工智能的浪潮中,我有幸作为项目负责人,带领团队深入挖掘数据的潜力,利用AI大模型的力量&am…...
linux C语言strcat函数及相关函数
讯飞星火 strcat函数是C语言中的一个字符串处理函数,用于将一个字符串追加到另一个字符串的末尾。它的原型如下: char *strcat(char *dest, const char *src);参数说明: dest:目标字符串,即要将src字符串追加到这个字符串的末尾。src:源字符串,即要追加到dest字符串末…...
使用 sort 进行文本文件处理
sort 使用经验笔记 一、简介 sort 是一个命令行工具,用于对文本文件中的行进行排序。它广泛应用于 Unix/Linux 系统中,可以用来对文件的内容进行简单的排序操作,也可以与其他命令结合使用来完成更复杂的任务。 二、基本用法 排序文件: sor…...

HarmonyOS笔记4:从云数据库获取数据
移动应用获取数据的方式主要有: 1.从网络中获取数据接口API。 2.从华为云数据库获取云数据库的资源。 3.从移动终端直接获取本地的数据 在HarmonyOS笔记3中已经完成了方式一从网络中获取数据接口API的方式。在本篇笔记中,将讨论从云数据库中获取数据。 因…...

QT5生成独立运行的exe文件
目录 1 生成独立运行的exe文件1.1 设置工程Release版本可执行文件存储路径1.2 将工程编译成Release版本 2 使用QT5自带的windeployqt拷贝软件运行依赖项3 将程序打包成一个独立的可执行软件exe4 解决QT5 This application failed to start because no Qt platform plugin could…...

LabVIEW光纤水听器闭环系统
开发了一种利用LabVIEW软件开发的干涉型光纤水听器闭环工作点控制系统。该系统通过调节光源频率和非平衡干涉仪的光程差,实现了工作点的精确控制,从而提高系统的稳定性和检测精度,避免了使用压电陶瓷,使操作更加简便。 项目背景 …...
Shell——流程控制语句(if、case、for、while等)
在 Shell 编程中,流程控制语句用于控制脚本的执行顺序和逻辑。这些语句包括 if、case、for、while 等,它们的使用可以使脚本实现更复杂的逻辑。以下是它们的详细说明和语法结构: 1. if 语句 if 语句用于条件判断,执行符合条件的…...

【redis的大key问题】
在使用 Redis 的过程中,如果未能及时发现并处理 Big keys(下文称为“大Key”),可能会导致服务性能下降、用户体验变差,甚至引发大面积故障。 本文将介绍大Key产生的原因、其可能引发的问题及如何快速找出大Key并将其优…...

HighPoint SSD7749M2:128TB NVMe 存储卡实现28 GB/s高速传输
HighPoint Technologies推出了一款全新的SSD7749M2 RAID卡,能够在标准的桌面工作站中安装多达16个M.2 SSD,实现高达128TB的闪存存储。该卡通过PCIe Gen4 x16接口提供高达28 GB/s的顺序读写性能。这些令人瞩目的性能规格伴随着高昂的价格标签。 #### 技术…...

ARM 裸机与 Linux 驱动对比及 Linux 内核入门
目录 ARM裸机代码和驱动的区别 Linux系统组成 内核五大功能 设备驱动分类 内核类型 驱动模块 驱动模块示例 Makefile配置 命令 编码辅助工具 内核中的打印函数 printk 函数 修改打印级别 编辑 打印级别含义 驱动多文件编译 示例 模块传递参数 命令行传递参数…...
0101DNS TCP fallback on UDP query timeout disabled-redission-中间件
文章目录 1.问题描述2.临时解决方案 结语 1.问题描述 Springcloud 项目,微服务模块使用redission,启动报错 DNS TCP fallback on UDP query timeout disabled. Upgrade Netty to 4.1.105 or higher.相关软件版本如下 软件版本描述springboot2.7.18spr…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...

Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

基于SpringBoot在线拍卖系统的设计和实现
摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...

push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...
vue3 daterange正则踩坑
<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…...
java+webstock
maven依赖 <dependency><groupId>org.java-websocket</groupId><artifactId>Java-WebSocket</artifactId><version>1.3.5</version></dependency><dependency><groupId>org.apache.tomcat.websocket</groupId&…...