## **可变参数** ##
可变参数 : 是通过宏来实现的
**1,可变参数的用法**
1,首先声明一个类型va_list的变量,与下面几个宏配合使用,访问参数的值。
2,va_start()用来初始化可变参数列表,它的第一个参数是va_list类型的变量的名字,第二个参数是省略号前最后一个有名字的参数,初始化过程把变量指向可变参数部分的第一个参数。
3,va_arg()返回这个参数的值,并使变量指向下一个可变参数,这个宏接收两个参数,va_list变量和参数列表中下一个参数的类型。
4,最后,访问完毕最后一个可变参数之后,调用va_end()用来释放这个变量,参数就为这个变量。
**2,可变参数的限制**
可变参数必须从头到尾按照顺序逐个访问,可以半途中止访问,但不能一开始直接访问参数列表中间的参数。
3,使用这三个宏简单实现printf函数
#include<stdio.h>
#include<stdarg.h>
void my_printf(char *formal, ...)
{
int tmp; //用来接收va_arg int类型的返回值
float ftmp;
char ctmp;
char *stmp;
va_list va;
va_start(va,formal); //初始化参数列表
while(*formal)
{
if(*formal != '\0')
{
formal++;
continue;
}
formal++;
switch(*formal)
{
case 'd' :
tmp = va_arg(va,int);
printf("%d\n",tmp);
break;
case 'f' :
ftmp = va_arg(va,float);
printf("%f\n",float);
break;
case 'c' :
ctmp = va_arg(va,char);
printf("%c\n",ctmp);
break;
case 's' :
stmp = va_arg(va,char*);
printf("%s\n",stmp);
break;
default :
break;
}
}
va_end(va); //释放va变量
}
int main()
{
char *str = "%d %d %d“;
my_printf(str,12,23,45);
return 0;
}