最近在学野火的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()函数的参数),如果没看明白我上面的解释,下面给出两个博客的地址你懂的