- Va_list以及相关函数的使用方法。
在头文件stdarg.h里面找到了关于这个几个函数的宏定义
#if !defined(__STDARG)
#define __STDARG
typedef void *va_list;
#define va_start(ap, parmN) (ap = ...)
#define va_arg(ap, type) (*((type *)(ap))++)
#define va_end(ap)
#define _va_ptr (...)
#endif
Va_list:可以把这个理解成一个这是自定义的一个变量类型,这里是指针类型。
Va_start():这是一个初始化函数,初始化va_list修饰的变量。例如va_start(a,b);
这里的a就是va_list修饰的变量,b是传参函数的一个变量,不一定是第一个参数(从左至右)
。这个函数的用意是在运行va_start(a,b)以后,a指向第一个可变参数在堆栈的地址。
Va_arg():返回参数列表中指针a所指的参数,返回类型可以自定义,并使指针a指向参数列表中下一个参数。例如va_arg(a,char);返回指针a所指向的参数,参数类型为 char型。还有就是使a指向下一个参数。
va_end():使va_list修饰的变量作废。就如va_end(a);实则没有进行操作,可以理解成一种规范。在函数中随着函数的结束可以自动的释放掉。
下面附上对这个函数的使用代码:
main()
{
showstr(p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,0);
}
void showstr(char *m,...)
{
char *p;
va_list a; /*声明一个va_list类型的变量*/
va_start(a,m); /*初始化这个变量a,使之指向接收不定参的第一个,也就是m的下一个参参数*/
do
{
printf("%s\n",m);
m = va_arg(a,int);/*返回a地址所指的参数,并且使a指向下一个地址*/
}while(m!=0);
va_end(a);/*结束对变量的定义*/
}
(第一次发博客,希望可以帮到有需要的朋友)