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…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...
GitHub 趋势日报 (2025年06月06日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...

若依登录用户名和密码加密
/*** 获取公钥:前端用来密码加密* return*/GetMapping("/getPublicKey")public RSAUtil.RSAKeyPair getPublicKey() {return RSAUtil.rsaKeyPair();}新建RSAUti.Java package com.ruoyi.common.utils;import org.apache.commons.codec.binary.Base64; im…...
32单片机——基本定时器
STM32F103有众多的定时器,其中包括2个基本定时器(TIM6和TIM7)、4个通用定时器(TIM2~TIM5)、2个高级控制定时器(TIM1和TIM8),这些定时器彼此完全独立,不共享任何资源 1、定…...

热门Chrome扩展程序存在明文传输风险,用户隐私安全受威胁
赛门铁克威胁猎手团队最新报告披露,数款拥有数百万活跃用户的Chrome扩展程序正在通过未加密的HTTP连接静默泄露用户敏感数据,严重威胁用户隐私安全。 知名扩展程序存在明文传输风险 尽管宣称提供安全浏览、数据分析或便捷界面等功能,但SEMR…...

pgsql:还原数据库后出现重复序列导致“more than one owned sequence found“报错问题的解决
问题: pgsql数据库通过备份数据库文件进行还原时,如果表中有自增序列,还原后可能会出现重复的序列,此时若向表中插入新行时会出现“more than one owned sequence found”的报错提示。 点击菜单“其它”-》“序列”,…...
Windows 下端口占用排查与释放全攻略
Windows 下端口占用排查与释放全攻略 在开发和运维过程中,经常会遇到端口被占用的问题(如 8080、3306 等常用端口)。本文将详细介绍如何通过命令行和图形化界面快速定位并释放被占用的端口,帮助你高效解决此类问题。 一、准…...