va_list介绍

vsprintf函数和va_list用法详解 今天写AVR单片机程序,看串口通讯函数: void UART1_Printf(char *fmt,...) {  va_list ap;  char string[128];  va_start(ap, fmt);  vsprintf(string, fmt, ap);  UART1_SendString(string);  va_end(ap); } 不解。查找了一下用法,记 阅读详情

一、在介绍va_list之前,首先介绍众所周知的printf()函数的实现,请看下面的代码:

int printf(char const* __restrict fmt,...)
{
	va_list arg_ptr;
	
	va_start(arg_ptr,fmt);
	
	int ret = vfprintf(stdout,fmt,arg_ptr);

	va_end(arg_ptr);

	return ret;
}


printf函数的形参列表长度是可变的,这种函数被称为变参函数,即参数的个数不确定。相比C++中的重载中对参数的个数的限制,变参函数使用起来比较灵活。

下面看下该函数是如何显现的。其主要使用的va_list类型才使得printf函数具有如此的灵活性。所以printf的使用灵活性应归功于va_list。


二、可变参函数的声明

在无法给出所有传递给函数的参数的类型和数目时,可以使用省略号(...)指定函数参数表。有如下几种形式:

	1 void fun1(int a, double b, ...); //给出确定的几个参数,其他用省略号
	2 void fun2(int a ...);            //省略号前有或者没有逗号都是可以的
	3 void fun3(...);                  //也可以不确定任何参数,但和没有参数是不一样的


三、va_start,va_arg,va_end三个宏的介绍:

下面三个宏是来调用操作可变参数:

	#include <stdarg.h>

	void va_start(
 	 	 va_list arg_ptr, //指向参数列表的指针
   				prev_param 	   //最后一个显式声明的参数,以用来获取第一个可变参数的位置
	);

	type va_arg( 	 
	 	va_list arg_ptr,  	
	 			type  //要获取的参数类型,如char,int,float等
	);		

	void va_end(
 	 	 va_list arg_ptr 
	);


四、va_start,va_arg,va_end三个宏的使用:

1、定义一个va_list变量,该变量是指向可变参数的指针。

2、使用va_start初始化刚刚声明的va_list变量。第二个参数是可变参数最后一个显式声明的参数。

3、使用va_arg返回可变参数的值,第二个参数是该可变参数的类型。注意需要确定va_list变量是否是指向你想要的变量。

4、使用va_end清空第一步声明的va_list变量为NULL.


注意:1、可变参数的类型和数目不能通过这三个宏来获取,只能通过程序来控制。

    2、编译器对可变参函数的原型检测不是很严格,可能会影响代码质量。


五、具体使用详见第一部分的printf函数的实现。


六、关于va_list和这三个宏是如何定义,请自行查看MFC中头文件stdio.h,stdarg.h。当然不用的编译器,有不同的定义。



自动驾驶仿真 (四)—— 基于PreScan与Simulink的AEB系统多场景验证 本文详细介绍了基于PreScan与Simulink的AEB系统多场景验证方法,涵盖标准场景搭建、复杂工况扩展及控制策略优化。通过仿真技术,显著降低测试成本并提升场景覆盖率,有效解决实车测试中的痛点问题。特别适用于自动驾驶领域的AEB系统开发与验证。 阅读详情

相关推荐

影像组学分析流程中,图像分割前要做的事(图像预处理)

在InputVolume中无法找到自己想要重采样的序列,这时可以检查一下序列的Volume type是不是MRMLMulti。这时,Volume type将由MRMLMulti改为Scaler,随后即可在3D slicer中完成Resample Scaler Volume。2.1、重采样:通过3Dslicer中的Resample Scaler Volume实现。具体设置参数:spacing(1,1,1),Interpolation选择Bspline。2、图像预处理:重采样和标准化。

weixin_45011313的博客 3723

可变参数:va_list(),va_start(),va_arg(),va_end() 详细解析

与 printf 类似,vsnprintf 可以根据格式化字符串中的占位符,将后续参数转换成对应的字符串并输出到缓冲区中,但是与 printf 不同的是,vsnprintf 可以指定输出的最大长度,以避免缓冲区溢出的问题。(1)format函数是一个可变参数函数,第一个参数pFmt是一个格式化字符串,后面的参数可以是任意数量的参数,用于填充格式化字符串中的占位符。va_start宏需要两个参数,分别是一个va_list类型的变量和可变参数的最后一个固定参数的地址。对变长参数列表进行访问和操作。

bigger_belief的博客 1万+

伯德图详解:从传递函数到系统稳定性的频域分析

在自动控制与控制系统设计中,理解系统对不同频率输入信号的响应特性,是分析和设计稳定系统的核心基础。频率响应描述了系统对正弦输入的幅值增益与相位变化规律,而伯德图作为最直观的频域分析工具,通过对数坐标将宽频带特性压缩成一条清晰曲线,让工程师无需复杂计算即可快速评估系统性能。从典型环节的渐近线绘制,到相位裕度、幅值裕度的读取,伯德图贯穿了系统稳定性判断、控制器参数整定及噪声抑制等关键场景。本文结合实际调试经验,系统讲解伯德图的绘制原理与读图方法,帮助读者快速掌握从传递函数到工程应用的核心技能。

weixin_34535286的博客 334

va_list的原理及用法

va_list原理及用法分类:编程2010-10-20 11:221426人阅读评论(1)收藏举报list编译器平台语言x86编程 VA_LIST 是在C语言中解决变参问题的一组宏,变参问题是指参数的个数不定,可以是传入一个参数也可以是多个;可变参数中的每个参数的类型可以不同,也可以相同;可变参数的每个参数并没有实际的名称与之相对应,用起来是很灵活。...

weixin_34274029的博客 993

Android Camera性能优化概述

做camera性能优化方面的工作有几年了,想写一篇文章简单介绍一下其中涉及到的具体技术,这篇文章会大概介绍一下涉及到的技术。

weixin_42136255的博客 4023

STM32F103C8T6+TB6612驱动直流电机全攻略(附PWM调速代码)

本文提供了一份基于STM32F103C8T6微控制器和TB6612驱动模块的直流电机驱动完整解决方案。详细解析了硬件连接、STM32CubeMX配置、HAL库驱动代码编写,并附带了PWM调速代码实现。内容涵盖从基础原理到实战调试的全过程,旨在帮助开发者快速构建稳定、可精准调速的电机控制系统,适用于智能车、机器人等嵌入式项目。

weixin_29181861的博客 585

va_list原理及用法

VA_LIST 是在C语言中解决变参问题的一组宏,变参问题是指参数的个数不定,可以是传入一个参数也可以是多个;可变参数中的每个参数的类型可以不同,也可以相同;可变参数的每个参数并没有实际的名称与之相对应,用起来是很灵活。 下面是va_list的用法示例 ...

ZKR_HN的博客 3万+

VirtualLab初学者教程-1.用户界面

目录前言一、VirtualLab Fusion简介1.软件2.内置工具箱:二、用户界面认识1.上方菜单栏2.右侧面主窗口3.底部窗口附 前言 感觉做VirtualLab的资料不是特别多,可能用的朋友也比较少吧,笔者最近也因为大创需要刚刚开始入门,把网上有的英文资料整理了一下,加了一点自己的内容发出来希望帮助更多在学习中的朋友,有用词不当之处还请多多包涵。 一、VirtualLab Fusion简介 因为是第一讲,简单啰嗦一下软件本身,参考官方介绍。 1.软件 VirtualLab是由德国LightTran

ClaireTang1的博客 2万+

VA_LIST可变参数列表的使用方法与原理

VA_LIST可变参数列表的使用方法与原理 va_list是在C语言中解决变参问题的定义的一个类型,常在 va_start(), va_arg(), and va_end() 宏中使用。变参问题是指参数的个数不定,可以是传入一个参数也可以是多个。可变参数中的每个参数的类型可以不同,也可以相同;可变参数的每个参数并没有实际的名称与之相对应,用起来是很灵活。 0x01 可变参数列表定义与使用 在Li...

Erice_s的博客 7491

手把手教你搞定6脚三位一体数码管的驱动(附C语言源码与Visual Studio调试技巧)

本文详细解析了6脚三位一体数码管的驱动原理与实战技巧,包括引脚复用、动态扫描时序、Visual Studio模拟调试及单片机实现。通过C语言源码示例和调试技巧,帮助开发者快速掌握非标准数码管的驱动方法,提升硬件开发效率。

weixin_30613727的博客 588

2小时用Trae搭建全功能CMS系统

在前文中,我们使用Trae从零搭建了一个用户文档站点,仅用不到2小时就实现了用户注册登录和文档的增删改查功能,且无需编写任何代码。本节我们将在此基础上,构建一个CMS后台管理系统,包含用户管理和文档管理两大功能模块。

2501_92019101的博客 540

自定义可变参函数

文章目录一、可变参函数1、va_list简介2、va_list成员3、va_list原理4、va_list用法 一、可变参函数   在C语言编程中,我们经常会遇到一些参数个数可变的函数,如:int printf(const char *format, ...);、scanf()等等。它除了第一个参数format固定以外,后面跟着的参数的个数和类型是可变的,其中...称作参数占位符。   可是上述中...

幻影maple 1145

大数据安全 | 期末复习(上)| 补档

大数据定义:无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。

知识库搭建ing 2588

详细介绍关于宏va_list ,va_start ,va_arg ,va_end的使用

之前在查阅资料时一直没有找到一个完整的介绍这些宏的文章,故根据自己的理解整理了一下。va_list ,va_start ,va_arg ,va_end是C中stdarg.h头文件里面的宏,它们主要用于配合处理一组可变参数,这组可变参数的数量无需提前确定,用起来十分灵活。

zhibaishouhei927的博客 1323

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

va_list简单介绍及初步实现printf函数

VA_LIST 是在C语言中解决变参问题的一组宏,所在头文件:#include ,用于获取不确定个数的参数。 C语言中的函数形参是从右向左压栈的,以此来保证栈顶是第一个参数 C语言中形参的这种存储结构使得我们可以用指针来寻找参数 用法: 首先在函数中定义一个va_list型的变量,这个变量指向参数的指针。 然后用va_start()初始化刚定义好的va_list变量  

ciaiy的博客 3645

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

VA_LIST介绍以及VA_START、VA_ARG、VA_END的用法

VA_LIST 是在c语言中解决变参问题的一组宏,所在头文件:#include 变量定义: #ifdef _M_ALPHA typedef struct { char *a0; /* pointer to first homed integer argument */ int offset; /* byte offset of next parameter */ } va_li

ruolin0923的博客 632

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

C/C++中可变参数的详细介绍(va_list,va_start,va_arg,va_end)

转自:http://www.jb51.net/article/41868.htm 可变参数的函数原理其实很简单,而va系列是以宏定义来定义的,实现跟堆栈相关.我们写一个可变函数的C函数时,有利也有弊,所以在不必要的场合,我们无需用到可变参数。如果在C++里,我们应该利用C++的多态性来实现可变参数的功能,尽量避免用C语言的方式来实现 由于在C语言中没有函数重

gmq_syy的博客 869

va_list中的_vsntprintf使用介绍

相信大家都用过sprintf这个函数,就是下面这样: int sprintf( char*buffer,const char*format[,argument] ...); 在之前看到了用va_list实现的几个处理字符串的函数,基本都是这种形式的,感到非常好用,今天来谈一下 va_list 的使用问题。 va_list的用法和原理网上一大堆,我都懒得抄了,大概介绍一下它的用法...

weixin_30925411的博客 203

【转】C/C++中可变参数的详细介绍(va_list,va_start,va_arg,va_end)

可变参数的函数原理其实很简单,而va系列是以宏定义来定义的,实现跟堆栈相关.我们写一个可变函数的C函数时,有利也有弊,所以在不必要的场合,我们无需用到可变参数。如果在C++里,我们应该利用C++的多态性来实现可变参数的功能,尽量避免用C语言的方式来实现。 由于在C语言中没有函数重载,解决不定数目函数参数问题变得比较麻烦,即使采用C++,如果参数个数不能确定,也很难采用函数重载。对这种情况,提...

Lasuerte的博客 417

关于C/C++中可变参数的详细介绍(va_list,va_start,va_arg,va_end)

学习一下///// 由于在C语言中没有函数重载,解决不定数目函数参数问题变得比较麻烦,即使采用C++,如果参数个数不能确定,也很难采用函数重载。对这种情况,提出了指针参数来解决问题。 如printf()函数,其原型为: int printf( const char* format, ...); 它除了有一个参数format固定以外,后面跟的参数的个数和类型是可变的,例如我...

lxie0的博客 583

va_list使用方法

转载自:http://blog.youkuaiyun.com/ID314846818/article/details/51074283 VA_LIST 是在C语言中解决变参问题的一组宏,变参问题是指参数的个数不定,可以是传入一个参数也可以是多个;可变参数中的每个参数的类型可以不同,也可以相同;可变参数的每个参数并没有实际的名称与之相对应,用起来是很灵活。 va_list 用法示例 #includ

一个菜鸟 6万+

va_list 详解

va_list 详解 VA_LIST 是在C语言中解决变参问题的一组宏 他有这么几个成员: 1) va_list型变量: #ifdef  _M_ALPHA typedef struct {         char *a0;       /* pointer to first homed integer argument */         int offset;

detachment1130的专栏 346

VA_LIST的用法

 有关VA_LIST的用法VA_LIST 是在C语言中解决变参问题的一组宏VA_LIST的用法:             (1)首先在函数里定义一具VA_LIST型的变量,这个变量是指向参数的指针      (2)然后用VA_START宏初始化变量刚定义的VA_LIST变量,这个宏的第二个参数是第一个可变参数的前一个参数,是一个固定的参数。

Karl的专栏 1246

C语言之va_list

无

qq_44632658的博客 5122
上一篇: 堆 and 栈
下一篇: 分析 BOOL & bool
SingleCode
博客等级 码龄15年 11粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值