可变参数用法
int func(int v,...)
{
int tmp;
va_list ap;
va_start(ap,v);
tmp = va_arg(ap,int);//若有多个可变参数,依次调用va_arg可返回参数
va_end(ap);
}
void var_args_func(const char * fmt, ...)
{
va_list ap;
va_start(ap, fmt);
printf("%d\n", va_arg(ap, int));
printf("%f\n", va_arg(ap, double));
printf("%s\n", va_arg(ap, char*));
va_end(ap);
}
int main()
{
var_args_func("%d %d %s\n", 4, 5, "hello world");
return 0;
}
上面是va_list的具体用法,下面讲解一下va_list各个语句含义和 va_list的实现。
可变参数实际上是由宏实现的,但是由于平台的不同,编译器的不同,宏的定义也不相同,下面是VC6.0中x86平台的定义:
定义及va_list 的实现
typedef char * va_list; // TC中定义为void*
#define _INTSIZEOF(n) ((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1) ) //为了满足需要内存对齐的系统
#define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) ) //ap指向第一个变参的位置,即将第一个变参的地址赋予ap
#define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) ) /获取变参的具体内容,t为变参的类型,如有多个参数,则通过移动ap的指针来获得变参的地址,从而获得内容/
#define va_end(ap) ( ap = (va_list)0 ) //清空va_list,即结束变参的获取
网友评论