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

Linux C语言 26-可变参数

Linux C语言 26-可变参数

本节关键字:可变参数、va_list、va_arg、va_end
相关C库函数:va_list、va_arg、va_end

什么是可变参数?

C语言中的可变参数是指函数能够接受不定数量的参数。在不确定函数参数时,使用“char *format, …”的方式提供多个参数的输入。可变参数的引入旨在解决:

  • 变参问题是指参数的个数不定,可以是传入一个参数也可以是多个;
  • 可变参数中的每个参数的类型可以不同,也可以相同;
  • 可变参数的每个参数并没有实际的名称与之相对应。
    因此,当函数的参数个数不确定时,就可以使用可变参数进行动态处理,这样就打打增加了程序的灵活性。

相关宏和函数

#include <stdarg.h>
#define va_start(v,l)    __builtin_va_start(v,l)
#define va_end(v)    __builtin_va_end(v)
#define va_arg(v,l)    __builtin_va_arg(v,l)void va_start(va_list ap, last);
type va_arg(va_list ap, type);
void va_end(va_list ap);
void va_copy(va_list dest, va_list src);int printf(const char *format, ...);
int vprintf(const char *format, va_list ap);
int vfprintf(FILE *stream, const char *format, va_list ap);
int vsprintf(char *str, const char *format, va_list ap);
int vsnprintf(char *str, size_t size, const char *format, va_list ap);

va_list的使用

(1)在函数中定义一个具有va_list型的变量,这个变量是指向参数的指针。
(2)用va_start宏初始化变量刚定义的va_list变量,使其指向第一个可变参数的地址。
(3)va_arg返回可变参数,va_arg的第二个参数是你要返回的参数的类型(如果多个可变参数,依次调用va_arg获取各个参数)。
(4)最后使用va_end宏结束可变参数的获取。

在使用va_list是应该注意以下问题:

  • 可变参数的类型和个数完全由代码控制,它并不能智能地识别不同参数的个数和类型。
  • 如果我们不需要一一详解每个参数,只需要将可变列表拷贝到某个缓冲区,可以用vsprintf函数。
  • 因为编译器对可变参数的函数原型检查不够严格,对编程查错不利,不利于我们写出高质量的代码。

va_list使用例程

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <time.h>void myprint(const char *format, ...)
{char str[1024] = {0};va_list vList;va_start(vList, format);vsprintf(str, format, vList);va_end(vList);printf("%s\n", str);
}int sum(char *format, ...)
{va_list vList;int nStep, sNum=0;va_start(vList, format);printf("%s\n", format);while (nStep = va_arg(vList, int)){// va_arg负责取出符合参数类型的下一个指针// 第一个参数时可变参数变量,第二个参数是传入参数类型,sNum += nStep;}va_end(vList);return sNum;
}int main(int argc, char *argv[])
{int rc;time_t tnow = time(0);struct tm *t = localtime(&tnow);myprint("%04d-%02d-%02d %02d:%02d:%02d %s\n", t->tm_year+1900, t->tm_mon+1, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec,"this is va_list testing program.");rc = sum("Hello World!", 1, 2, 3, 4);myprint("rc=%d\n", rc);return 0;
}/** 运行结果:
2023-11-24 16:57:01 this is va_list testing program.Hello World!
rc=10*/

相关文章:

Linux C语言 26-可变参数

Linux C语言 26-可变参数 本节关键字&#xff1a;可变参数、va_list、va_arg、va_end 相关C库函数&#xff1a;va_list、va_arg、va_end 什么是可变参数&#xff1f; C语言中的可变参数是指函数能够接受不定数量的参数。在不确定函数参数时&#xff0c;使用“char *format, …...

Gin 学习笔记02-参数获取

Gin 参数获取 1、获取url 参数2、获取动态 url 参数3、获取 form 表单数据 1、获取url 参数 Query()GetQuery()QueryMap()DefaultQuery() package mainimport ("fmt""github.com/gin-gonic/gin""net/http" )func _query(c *gin.Context) {// 1…...

Uniapp Vue3 基础知识点附带实例

包括数据绑定和计算属性、条件渲染和列表渲染、事件处理、表单输入处理、生命周期钩子、自定义指令和过滤器、路由和导航以及状态管理&#xff08;如Vuex&#xff09;&#xff1a; <template><div><!-- 条件渲染 --><div v-if"showMessage">…...

【迅搜03】全文检索、文档、倒排索引与分词

全文检索、文档、倒排索引与分词 今天还是概念性的内容&#xff0c;但是这些概念却是整个搜索引擎中最重要的概念。可以说&#xff0c;所有的搜索引擎就是实现了类似的概念才能称之为搜索引擎。而且今天的内容其实都是相关联的&#xff0c;所以不要以为标题上有四个名词就感觉好…...

MySql之索引,视图,事务以及存储过程举例详解

一.数据准备 数据准备可参考下面的链接中的数据准备步骤 MySql之内连接&#xff0c;外连接&#xff0c;左连接&#xff0c;右连接以及子查询举例详解-CSDN博客 &#xff08;如有问题可在评论区留言&#xff09; 二.存储过程 1.定义 存储过程 PROCEDURE &#xff0c;也翻译…...

AR眼镜双目光波导/主板硬件方案

AR(增强现实)技术的发展离不开光学元件&#xff0c;而在其中&#xff0c;光波导和Micro OLED被视为AR眼镜光学方案的黄金搭档。光学元件在AR行业中扮演着核心角色&#xff0c;其成本高昂且直接影响用户体验的亮度、清晰度和大小等因素。AR眼镜的硬件成本中&#xff0c;光机部分…...

单片机调试技巧--修改bin文件实现断点

fromelf --text -a -c --outputall.dis F103_Moduel\F103_Moduel.axffromelf --bin --outputtest.bin F103_Moduel\F103_Moduel.axf 在启动文件中&#xff0c;修改UsageFault_Handler UsageFault_Handler\PROC; get current contextTST lr, #0x04 ; if(!EXC_RETURN[2])ITE…...

微信小程序:This Mini Program cannot be opened as your Weixin version is out-of-date.

项目场景&#xff1a; 问题描述 升级基础库3.2.0&#xff0c;然后PC端整个小程序都打不开了&#xff0c;点击小程序提示”This Mini Program cannot be opened as your Weixin version is out-of-date. Update Weixin to the latest version.“&#xff0c;并且点击Update Wei…...

04 C++中的四种强制类型转换

系列文章目录 04 C中的四种强制类型转换 目录 系列文章目录 文章目录 前言 一、静态转换&#xff08;Static Cast&#xff09; 二、动态转换&#xff08;Dynamic Cast&#xff09; 三、常量转换&#xff08;Const Cast&#xff09; 四、重新解释转换&#xff08;Reinte…...

电力感知边缘计算网关产品设计方案-边缘计算自控算法模型

边缘计算网关与其他数据采集的IoT网关设备不同之处在于可以根据应用场景和产品解决方案,单独设置一些边缘计算算法模型,实现离线系统和边缘计算自控逻辑判别+执行系统方案,自控算法逻辑单元也是边缘计算网关自控系统方案的核心单元。 自控算法逻辑单元根据产品应用不同,有…...

C语言进阶之笔试题详解(1)

引言&#xff1a; 对指针知识进行简单的回顾&#xff0c;然后再完成笔试题。 ✨ 猪巴戒&#xff1a;个人主页✨ 所属专栏&#xff1a;《C语言进阶》 &#x1f388;跟着猪巴戒&#xff0c;一起学习C语言&#x1f388; 目录 引言&#xff1a; 知识简单回顾 指针是什么 指针变…...

报道|2023 INFORMS 最佳论文(部分)华人获奖者名单

编者按 本文收集了部分2023年INFORMS年会最佳论文评选的华人获奖者名单&#xff0c;祝贺获奖者们&#xff01;如果读者身边有本文遗漏的获奖者请在文章下方评论区告诉小编。 ● George Nicholson学生论文竞赛一等奖&#xff1a; Bayesian Design Principles for Frequentist …...

【Docker】从零开始:12.容器数据卷

【Docker】从零开始&#xff1a;12.容器数据卷 1.什么是容器数据库卷2.数据的覆盖问题3.为什么要用数据卷4.Docker提供了两种卷&#xff1a;5.两种卷的区别6.bind mount7.Docker managed volumevolume 语法volume 操作参数 1.什么是容器数据库卷 卷 就是目录或文件&#xff0c…...

Spring Boot 整合MyBatis-Plus 详解

MyBatis-Plus (opens new window)&#xff08;简称 MP&#xff09;是一个 MyBatis (opens new window)的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 全新的 MyBatis-Plus 3.0 版本基于 JDK8&#xff0c;提供了 lambda 形…...

【前端】让列表像Excel单元格一样编辑

前言 领导说了一堆的话,最后总结一句就是客户很懒,客户的员工更加懒。 本着让别人节省时间的原则,提倡出了让列表和Excal的单元格一样,不仅看数据还可以随时更改数据。 查资料 根据 Jeecg-Vue3 源码介绍,从而知道是基于 Vben Admin 开源项目进行改造的。 因此在 Vben…...

数字图像处理-Matlab实验

实验一 图像增强 实验内容: 对于给定的低对比度测试图像,利用灰度图像直方图均衡化算法进行图像视觉效果增强。 对于给定的低照度彩色测试图像,结合颜色空间转换和灰度图像直方图均衡化算法进行图像视觉效果增强。 实验数据: Test1_1.jpg: Test1_2.jpg: 实验步骤: %% …...

Nginx:配置文件详解

一、Nginx配置文件 main配置段&#xff1a;全局配置 events段&#xff1a;定义event工作模式 http {}&#xff1a;定义http协议配置 支持使用变量&#xff1a; 内置变量&#xff1a;模块会提供内建变脸定义 自定义变量&#xff1a;set var_name value 二、 主…...

卷积,是什么?

其实就是对事物的作用&#xff0c;或者说作用力&#xff0c;比如说&#xff0c;石板上没有字&#xff0c;我们刻上字&#xff0c;便于识别&#xff0c;从机器视觉角度来说&#xff0c;就是对图像的作用力&#xff0c;这种作用使得能看清想要的东西&#xff0c;感觉还是很主观&a…...

Javascript的闭包有哪些应用?

JavaScript 中的闭包是一种强大的特性&#xff0c;它可以用于多种应用。以下是一些闭包在 JavaScript 中的常见应用&#xff1a; 1、封装私有变量&#xff1a; 通过闭包&#xff0c;可以创建私有变量和方法。外部作用域无法直接访问闭包内的变量&#xff0c;从而实现了信息隐藏…...

LCM-LoRA模型推理简明教程

潜在一致性模型 (LCM) 通常可以通过 2-4 个步骤生成高质量图像&#xff0c;从而可以在几乎实时的设置中使用扩散模型。 来自官方网站&#xff1a; LCM 只需 4,000 个训练步骤&#xff08;约 32 个 A100 GPU 小时&#xff09;即可从任何预训练的稳定扩散 (SD) 中提取出来&#…...

HTML----列表与表格

一、列表标签1.<ul>:无序列表标签&#xff0c;用来放没有先后顺序的并列内容2.<ol>:有序列表标签&#xff0c;用来存放有明确先后顺序的步骤内容3.<li>:列表项&#xff0c;不管是<ul>还是<ol>里面都只能放.<li>&#xff0c;不能直接写文字…...

通义千问2.5-7B-Instruct作品集:智能生成的会议摘要案例分享

通义千问2.5-7B-Instruct作品集&#xff1a;智能生成的会议摘要案例分享 1. 会议摘要智能化的价值与挑战 在现代企业运营中&#xff0c;会议占据了大量工作时间。据统计&#xff0c;普通管理者每周平均参与12小时以上的会议&#xff0c;其中30%的时间被浪费在信息整理和确认上…...

springboot基于SpringBoot的养老中心管理系统_i9o9c8r5

前言 基于SpringBoot的养老中心管理系统是一款专为养老机构设计的综合性信息化管理平台&#xff0c;旨在通过数字化手段优化养老服务流程、提升管理效率、保障老人安全与健康&#xff0c;同时增强家属与养老中心的互动。一、项目介绍 开发语言&#xff1a;Java 框架&#xff1a…...

从零学卷积神经网络——梯度下降,反向传播,卷积核权重视觉对比

很多人在刚接触卷积神经网络时&#xff0c;会被满屏的矩阵数字搞晕。其实&#xff0c;卷积核并不是冰冷的算式&#xff0c;你可以把它想象成一副副“神奇眼镜”。比如这张 77 的图像&#xff0c;左上和右下是亮区&#xff0c;其他地方是暗区。现在&#xff0c;我们让它分别戴上…...

TortoiseSVN与BeyondCompare高效协作:从配置到实战的完整指南

1. 为什么需要TortoiseSVN与BeyondCompare集成 如果你经常使用TortoiseSVN进行版本控制&#xff0c;肯定遇到过内置差异查看器不够直观的问题。默认的diff工具只能显示简单的文本对比&#xff0c;对于代码变更的识别效率很低。而BeyondCompare作为专业的文件对比工具&#xff0…...

【AIAgent代码审查黄金标准】:2026奇点大会联合IEEE发布的首个L3级可信审查评估框架(仅限首批200家获授)

第一章&#xff1a;2026奇点智能技术大会&#xff1a;AIAgent代码审查 2026奇点智能技术大会(https://ml-summit.org) 在2026奇点智能技术大会上&#xff0c;AIAgent代码审查成为核心议题之一。与传统静态分析工具不同&#xff0c;新一代AIAgent具备上下文感知、跨文件语义理解…...

Grafana仪表板安全嵌入实践:解决iframe跨域与登录验证难题

1. 为什么需要安全嵌入Grafana仪表板 在企业监控系统开发中&#xff0c;我们经常需要将Grafana仪表板集成到自有系统中。直接使用iframe嵌入看似简单&#xff0c;但实际操作时会遇到两个棘手问题&#xff1a;首先是浏览器控制台频繁报错"Refused to display in a frame&qu…...

大模型量化秘籍:小白程序员也能轻松玩转Int8/Int4,建议收藏!

大模型量化秘籍&#xff1a;小白程序员也能轻松玩转Int8/Int4&#xff0c;建议收藏&#xff01; 本文深入浅出地解析了大语言模型&#xff08;LLM&#xff09;量化技术的原理&#xff0c;解释了为何在降低显存占用和计算压力的同时&#xff0c;模型性能仍能基本保持。核心在于模…...

大麦网自动抢票脚本完整指南:从零搭建你的智能购票系统

大麦网自动抢票脚本完整指南&#xff1a;从零搭建你的智能购票系统 【免费下载链接】Automatic_ticket_purchase 大麦网抢票脚本 项目地址: https://gitcode.com/GitHub_Trending/au/Automatic_ticket_purchase 你是否曾经为抢不到热门演唱会门票而苦恼&#xff1f;当心…...

C#编写的欧姆龙Fins HostLink协议底层通讯代码,800多行串口通讯源程序,深入研究...

C#写的欧姆龙Fins HostLink协议底层通讯代码&#xff0c;串口通讯源程序&#xff0c;自己研究通讯写的&#xff0c;已测试OK&#xff0c;共有800多行代码&#xff0c;可以了解欧姆龙Fins HostLink协议底层通讯原理&#xff0c;可以封装成库&#xff0c;代码有可复制性半夜两点盯…...