va_list va_start va_arg va_end解析

最近在学野火的M3板子,发现串口的发送程序发现有va_list va_list va_start va_arg这些东东,以前没见到过啊。于是乎上网百度了一番,可得到出一下结论:
va_list va_start va_arg va_end这些是用在C函数的参数不确定时会用到的如printf()函数。
在VC++6.0的include有一个stdarg.h头文件,有如下几个宏定义:
#define _INTSIZEOF(n)   ((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1) ) 
#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) )           //第一个可选参数地址

#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) ) //下一个参数地址

#define va_end(ap)    ( ap = (va_list)0 )                            // 将指针置为无效
实际上va_list va_start va_arg va_end的作用就是将可变参数(即参数个数可变)一个一个的取出来。
例:int fun1(int i,...) //此例子中在i变量后面出现的参数都是可变参数
{
va_list arg_ptr;
va_start( arg_ptr ,i);//得到第一个可变参数的地址,即i后一个参数的地址
va_arg( arg_ptr ,数据类型); //得到第一个参数的值,并将值转化为你想要的数据类型
//然后arg_ptr指向下一个可变参数的地址
va_end(arg_ptr); //置空
}


int fun2(int i,int y...) //此例子中在i变量后面出现的参数都是可变参数
{
va_list arg_ptr;
va_start( arg_ptr ,y); //得到第一个可变参数的地址,即y后一个参数的地址
va_arg( arg_ptr ,数据类型); //得到第一个参数的值,并将值转化为你想要的数据类型
//然后arg_ptr指向下一个可变参数的地址
va_end(arg_ptr); //置空
}
用这两个函数只是想说明那些是可变参数,可变参数时函数中用"..."表示的参数(具体看va_start()函数的参数),
如果没看明白我上面的解释,下面给出两个博客的地址你懂的
1    2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值