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
原文地址:https://www.cnblogs.com/vendanner/p/4784388.html