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…...
年度名场面!黄仁勋逛胡同被投喂豆汁,眉头紧锁。网友:弥补了没有喝过 XX 的遗憾
5 月 15 日,「黄仁勋 南锣鼓巷」话题突然在多平台引爆热议。谁能想到,手握 5 万亿美刀市值的科技大佬,私下里竟是胡同干饭人。昨天在大会堂还是西装革履,今天老黄换上他的经典皮肤套装,带几名随行人员低调逛南锣鼓巷和…...
使用 QLineF 从 QTransform 提取角度信息
我们在对 QGraphicsItem 进行变换时,QT 提供了很多便捷的方法。但当我们想获取当前变换的角度时却有些困难,因为 QTransform 没有提供获取角度的方法。在文章Qt 从 QTransform 逆向解出 Translate/Scale/Rotate(平移/缩放/旋转)分…...
从Excel到数据库:用Pandas Timestamp统一你的时间数据(pd.to_datetime实战解析)
从Excel到数据库:用Pandas Timestamp统一你的时间数据(pd.to_datetime实战解析) 在数据工程领域,时间数据的标准化处理往往是ETL流程中最容易被低估的痛点。当Excel表格中的"2023/1/15"遇上数据库里的"15-JAN-23&q…...
别再折腾Java环境了!用Docker一键部署BurpSuite社区版,5分钟开箱即用
用Docker容器化技术5分钟部署BurpSuite社区版:告别Java环境配置噩梦 在网络安全领域,BurpSuite无疑是Web应用渗透测试的瑞士军刀。但传统安装方式需要配置Java环境、处理兼容性问题,甚至不少用户为了功能完整而冒险使用破解版。现在…...
打造极致氛围感编码环境:从视觉、听觉到工作流的全栈实践指南
1. 项目概述:当“氛围感”遇上“编码”,一个宝藏仓库的诞生如果你和我一样,是个对开发环境、工具流和“仪式感”有执念的程序员,那你肯定不止一次地折腾过自己的IDE主题、终端配色、字体,甚至桌面的壁纸和音乐。我们内…...
Cursor编辑器光标主题自定义指南:从原理到实践
1. 项目概述:一个为开发者准备的“光标”资源宝库如果你是一名开发者,或者对提升代码编辑器的视觉体验和操作效率有追求,那么你很可能听说过或正在使用 Cursor 这款新兴的代码编辑器。它凭借深度集成的 AI 能力和现代化的设计,吸引…...
告别加密日志:MTK平台离线调试利器SpOffineDebugSuite v3.4安装与使用全攻略
MTK平台离线调试实战:SpOffineDebugSuite v3.4与GAT工具链深度解析 在移动设备开发领域,联发科技(MTK)平台因其高性价比和丰富功能而广受欢迎。然而,当系统出现崩溃或异常时,传统的在线调试方式往往受限于设备连接状态和实时性要求…...
GraphQL-WS服务器配置:完整参数详解与最佳实践
GraphQL-WS服务器配置:完整参数详解与最佳实践 【免费下载链接】graphql-ws Coherent, zero-dependency, lazy, simple, GraphQL over WebSocket Protocol compliant server and client. 项目地址: https://gitcode.com/gh_mirrors/gr/graphql-ws GraphQL-WS…...
Zeek日志AI分析平台:从网络监控到智能威胁检测的架构与实践
1. 项目概述:从开源网络监控到智能分析的进化如果你在网络安全、运维或者数据分析领域摸爬滚打过几年,大概率听说过 Zeek(以前叫 Bro)。它不是一个简单的入侵检测系统,而是一个功能强大的网络分析框架,能够…...
Arm Cortex-A78处理器仿真技术与Iris架构实践
1. Arm Cortex-A78AE/A78C处理器仿真技术解析在半导体设计领域,处理器仿真技术已经成为芯片开发流程中不可或缺的关键环节。作为Armv8.2-A架构的代表性产品,Cortex-A78AE和A78C处理器采用了创新的Iris组件体系进行建模,这种基于指令集架构(IS…...
