可变参数函数的使用:va_start() , va_end() , va_list

我们来一起聊聊va_list、va_start、va_arg、va_end 在C/C++中, 经常会接触到变参, 也就是va(variable argument), 我们的printf函数就是这么做的。 搞过软件开发的人肯定知道, 几乎所有软件的日志函数, 都会采用变参。 下面, 我们来一起聊聊va_list、va_start、va_arg、va_end 看一下这些东东在VC++6.0中的定义: 阅读详情
#include <stdio.h>
#include <stdarg.h>

void arg_test(int i, ...);
void arg_test1(int i , ...) ;
int main()
{
    //int int_size = _INTSIZEOF(int);
    //printf("int_size=%d\n", int_size);
    //arg_test(4,1,2,3,4);
    arg_test1(4,1,2,3,4);
    return 0;
}
void arg_test(int i, ...)
{
    int j=0;
    va_list arg_ptr;
    
    va_start(arg_ptr, i);
    printf("&i = %p\n", &i);//打印参数i在堆栈中的地址
    printf("arg_ptr = %p\n", arg_ptr);
    //打印va_start之后arg_ptr地址,
    //应该比参数i的地址高sizeof(int)个字节
    //这时arg_ptr指向下一个参数的地址
    j=*((int *)arg_ptr);
    printf("%d %d\n", i, j);
    j=va_arg(arg_ptr, int);
    printf("arg_ptr = %p\n", arg_ptr);
    //打印va_arg后arg_ptr的地址
    //应该比调用va_arg前高sizeof(int)个字节
    //这时arg_ptr指向下一个参数的地址
    j=va_arg(arg_ptr, int);
    printf("%d %d\n", i, j);
    j=va_arg(arg_ptr, int);
    printf("%d %d\n", i, j);
    j=va_arg(arg_ptr, int);
    printf("%d %d\n", i, j);
    va_end(arg_ptr);
}

void arg_test1(int i , ...)
{
	va_list ar_ptr ;
	va_start(ar_ptr , i) ;
	for(int n = 0 ; n < i ; ++ n)
	{
		int value = va_arg(ar_ptr , int) ;
		printf("%d\n" , value) ;
	}
	va_end(ar_ptr) ;
}

针对中文CLIP模型训练失效的解决方案记录 解决了中文CLIP模型无法正确训练的问题 阅读详情

相关推荐

python——模拟砍价

类型:随机数。

m0_62488776的博客 1972

c语言va_start函数,va_start和va_end,以及c语言中的可变参数原理

FROM:http://www.cnblogs.com/hanyonglu/archive/2011/05/07/2039916.html本文主要介绍va_start和va_end的使用及原理。在以前的一篇帖子Format MessageBox详解中曾使用到va_start和va_end这两个宏,但对它们也只是泛泛的了解。介绍这两个宏之前先看一下C中传递函数的参数时的用法和原理:引言:在C中,如果...

weixin_35698867的博客 2803

新手也能搞定的ANPC三电平逆变器Simulink仿真:从SPWM调制到开关损耗优化

本文详细介绍了如何在Simulink中搭建ANPC三电平逆变器仿真模型,从SPWM调制基础到开关损耗优化技巧。通过分层设计思路和实用代码示例,帮助新手快速掌握ANPC拓扑的核心功能,包括中点平衡控制和性能指标分析,为电力电子系统设计提供实践指导。

weixin_30335575的博客 410

理解可变参数 va_list、va_start、va_arg、va_end 原理及使用方法

其中,type 是指要获取的参数的类型,比如 int,char * 等,arg_ptr 是指向参数列表的指针(va_list类型),prev_param 是指最后一个显式声明的参数,以用来获取第一个变长参数的位置。比如 printf 函数,就是根据第一个参数推导可选实参:如果第一个'%'后有一个's',说明后面要有第二个参数,类型是字符串;大多数带有变长参数的函数都利用显式声明的参数中的一些信息,来获取调用中提供的其他可选实参的类型和数目。c)va_arg 返回变长参数的值,第二个参数是该变长参数的类型。

布袋和尚 644

Win本地部署DeepSeek

Ollama 提供了简单的接口,用于创建、运行和管理这些模型,同时还维护了一个丰富的预构建模型库,可以轻松集成到各种应用程序中。重启ollama,具体操作为打开搜索ollama进程,将其结束进程,之后再执行相关模型下载命令即可,或重启电脑!Ollama支持多种DeepSeek模型版本,用户可以根据硬件配置选择合适的模型。配置添加系统环境变量OLLAMA_MODELS,设置其值为新的路径,点击确定应用。安装完成后,在终端输入以下命令,检查Ollama版本。:14B、32B或70B版本,适合高端GPU。

m0_67297673的博客 2394

Flocking for Multi-Agent Dynamic Systems: Algorithms and Theory的理论简述和python仿真实现(附源码)

经典论文Flocking for Multi-Agent Dynamic Systems: Algorithms and Theory的学习与编程仿真,提供源码

m0_59701926的博客 1239

C语言函数之可变参数原理:va_start、va_arg及va_end

说到C语言函数可变参数,我们最先想到的可能就是printf、scanf、printk了。在Linux-2.6.24.7内核源码里,printk函数原型如下: asmlinkageintprintk(constchar*fmt,...) asmlinkage表示通过堆栈传递参数。gcc编译器在汇编过程中调用c语言函数时传递参数有两种方法:一种是通过堆栈,另一种是通过寄存器。缺省时采用寄存器,假如你要在你的汇编过程中调用c语言函数,并且想通过堆栈传递参数,你定...

stephenbruce的博客 9254

【SOC估算】基于EKF与神经网络融合的锂电池SOC高精度估计及Matlab实现

本文探讨了基于EKF与神经网络融合的锂电池SOC高精度估计方法。通过结合扩展卡尔曼滤波(EKF)的模型驱动优势和神经网络的数据驱动学习能力,实现了对电池荷电状态(SOC)的精准预测。Matlab仿真验证了该混合算法在各种工况下均能显著降低估计误差,提升电池管理系统性能。

play7的博客 696

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

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

bigger_belief的博客 1万+

MimicKit 人形机器人强化学习全身模仿控制算法使用教程

本文介绍了MimicKit运动模仿算法框架的使用指南。主要内容包括:1)安装IsaacGym和依赖项;2)训练模型命令及参数说明;3)测试模型的方法;4)分布式训练配置;5)使用TensorBoard可视化日志;6)动作数据格式说明。该框架支持DeepMimic、AMP、ASE、ADD等算法,包含PPO、AWR等强化学习算法,适用于物理仿真角色动画控制研究。

机器人控制与仿真应用 1203

MinerU在线API异步调用代码开发示例

本文展示了如何使用Python异步编程调用MinerU在线API进行文件批量上传。代码示例包含三个主要功能:1) 通过API密钥获取文件上传URL;2) 使用信号量控制并发上传多个文件;3) 获取提取结果。实现采用httpx异步客户端和asyncio库,支持文件存在性检查、错误处理和日志记录。示例中演示了如何上传PDF文件到MinerU平台,并提供了获取批量处理结果的接口。该代码可作为异步调用MinerU API的参考实现。

拥抱具身智能,昇腾Ascend C 357

C语言中可变参数的用法——va_list、va_start、va_arg、va_end参数定义

C语言可变参简介     我们在C语言编程中会遇到一些参数个数可变的函数,例如printf()这个函数,它的定义是这样的:       int printf( const char* format, ...);   它除了有一个参数format固定以外,后面跟的参数的个数和类型是可变的,例如我们可以有以下不同的调用方法:        printf("%d",i);

AddyLee的专栏 7万+

【智能流体力学】使用ANSYS Fluent + SpaceClaim + SCDM制作流体力学前处理的几何模型

生成来源.scdoc文件来自前处理工具生成的模型数据,或在 FLUENT 中创建和保存的模型。生成方式: 通过前处理工具导出网格数据,或在 FLUENT 中设置并保存模型。作用: 用于储存模型的结构信息和设置,确保在 FLUENT 中的正确导入和使用。.x_t文件是 Parasolid 文件格式的扩展名,用于存储三维模型数据。在 ANSYS Fluent 中,这种格式通常用于在前处理工具之间交换几何数据。要创建.x_t。

源代码杀手的博客 3265

如何实现可变参数函数

如何实现自己的可变参数函数,像printf()那样?技术上,主要用到3个宏:va_arg, va_end, va_start.void va_start(   va_list arg_ptr );  // (UNIX version)void va_start(   va_list arg_ptr,      prev_param ); // (ANSI version)type va

Energetic Life 508

lwip-2.0.3

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

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

C C++中使用可变参数

C C++中使用可变参数

qq_43678306的博客 409

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

va_list、 va_start、 vsprintf、va_end 用法

小知识点总结:(知识点2、3是为了更好理解知识点1) 知识点1:va_list、 va_start、 vsprintf、va_end 用法:  看同事LCD工程里面有这样的应用-- va_list arg_ptr;      va_start(arg_ptr, format); slen = vsprintf(buf, format, arg_ptr);     va_e

尹宣_liang的嵌入式成长之路 1万+

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

va_list/va_start/va_end/va_arg可变参数的使用

做日志打印或其它可变参数处理时,通常我们会想到使用va_list/va_start/va_end做可变参数的收集和处理。使用这种方式处理可变参数比较通用,同时适用于c与c++中。

春夜喜雨的专栏 1728

va_list 、va_start、 va_arg、 va_end 使用说明

在ANSI C中,这些宏的定义位于stdarg.h中: typedef char *va_list; va_start宏,获取可变参数列表的第一个参数的地址(list是类型为va_list的指针,param1是可变参数最左边的参数): #define va_start(list,param1)   ( list = (va_list)&amp;param1+ sizeof(param1) )...

3万+

va_start() - va_end() - va_arg() - va_copy() - va_list - Handle variable argument list (处理可变参数列表)

va_start() - va_end() - va_arg() - va_copy() - va_list - Handle variable argument list (处理可变参数列表)

程永强 1159

va_list可变参数理解(va_start/va_end...)

在工作中,一些可变参函数里总能看到va_start、va_end、vsnprintf、va_list等相关函数,甚是疑惑,到底是干啥的,有什么作用呢? va = variable argument 先来简单介绍一下可变参数吧,先来看看最最熟悉的printf函数。 int printf(const char *format, ...);这三个点点就是可变参数。 好了,开始介绍va相关内容吧! 1.作用 VA_LIST是在C语言中解决变参问题的一组宏。 有点绕,我的理解,如果你写代码过程中,需要对

CKX的博客 1607

【c++随笔08】可变参数——va_list、va_start、va_end、va_arg

原创作者:郑同学的笔记原创地址:https://zhengjunxue.blog.youkuaiyun.com/article/details/131690070qq技术交流群:921273910当你在编写 C++ 函数时,有时候你会需要处理可变数量的参数。C++ 中提供了 头文件,其中包含了用于处理可变参数的函数和宏。本教程将向你介绍如何使用 来编写可变参数的函数。

junxuezheng的博客 2219

va_list、va_start、va_arg、va_end宏的使用(转)

当你的函数的参数个数不确定时,就可以使用上述宏进行动态处理,这无疑为你的程序增加了灵活性。Example:CString AppendString(CString str1,...)//一个连接字符串的函数,参数个数可以动态变化{      LPCTSTR str=str1;//str需为指针类型,因为va_arg宏返回的是你的参数的指针,但是如果你的参数为int等简           

坚持,才是力量.老实做人,踏实做事. 3872

va_list、va_start和va_end使用

我们知道va_start,va_arg,va_end是在stdarg.h中被定义成宏的,由于1、硬件平台的不同 2、编译器的不同,所以定义的宏也有所不同。在ANSI C中,这些宏的定义位于stdarg.h中,典型的实现如下:注:以上sizeof()只是为了说明工作原理,实际实现中,增加的字节数需保证为为int的整数倍为了理解这些宏的作用,我们必须先搞清楚:C语言中函数参数的内存布局。首先,函数参数是存储在栈中的,函数参数从右往左依次入栈。

木牛的博客 1917

list初始化赋值_va_list、va_start和va_end使用

va_list、va_start和va_end使用我们知道va_start,va_arg,va_end是在stdarg.h中被定义成宏的,由于1、硬件平台的不同 2、编译器的不同,所以定义的宏也有所不同。在ANSI C中,这些宏的定义位于stdarg.h中,典型的实现如下:typedef char *va_list;va_start宏,获取可变参数列表的第一个参数的地址(list是类型为va_li...

weixin_39836063的博客 1415
上一篇: 【Visual C++】Windows GDI贴图闪烁解决方法
下一篇: OpenCV中Mat操作clone() 与copyto()的区别
知行且执行
博客等级 码龄14年 38粉丝 73原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值