1.声明形式
返回类型 函数名(参数类型 argument1, ...)
说明:(1)参数列表中至少要有一个有名参数,如argument1;
(2)省略号只能出现在参数列表的尾部;
(3)省略号表示参数表中参数的个数和类型可变。
2.头文件
#include<stdarg.h>
3.一个指针类型与三个宏
a) va_list
用于声明一个变量,改变两将依次引用各参数,称该变量为“参数指针”。
b) va_start
将参数指针初始化为指向第一个无名参数的指针。
c) va_arg
将返回一个无名参数,并将参数指针指向下一个无名参数。va_arg使用一个类型名(如int, double等)来决定返回的无名参数的类型,以及参数指针移动的步长。
d) va_end
完成一些必要的清理工作。
4.使用示例
//使用变长参数简单实现了一下类似于printf的功能
#include <stdarg.h>
#include <stdio.h>
void minPrintf(char* fmt, ...)
{
va_listap;
va_start(ap,fmt);
char*p, *sVal;
intiVal;
doubledVal;
for(p=fmt;*p!=0;p++)
{
if('%' != *p)
{
putchar(*p);
continue;
}
switch(*++p)
{
case'd':
{
iVal = va_arg(ap, int);
printf("%d",iVal);
break;
}
case'f':
dVal = va_arg(ap, double);
printf("%f",dVal);
break;
case's':
for(sVal=va_arg(ap,char*);*sVal!=0;sVal++)
{
putchar(*sVal);
}
break;
default:
putchar(*p);
break;
}
}
va_end(ap);
}
5.一般定义变长参数函数的方式
a) 将函数声明为如下形式:
返回值 函数名(char* format, ...)
说明:参数format为格式化串,如"thisis a %d ";格式化串中的%号有几个,就代表后面的变长参数有几个,在该函数实现的内部就调用几次va_arg
b) 函数内部实现流程
对第三步的说明:
根据格式化串format,多次调用va_arg ;
格式化串可以得到两方面的信息:
(1)变长参数有几个 (2)每个实参是什么类型