需求: 自己设置一个形如 printf()这样的函数,其函数的参数个数是可变的。第一个参数为字符串,里面有其他形参的数据类型信息。
参考代码如下:
#include<stdio.h>
#include<varargs.h>
void myPrintf (va_alist) va_dcl
{
va_list ap;
char *format;
va_start(ap);
format = va_arg(ap,char *);
vfprintf(stdout,format,ap);
va_end(ap);
}
解释:
定义可变参数函数时,,在函数定义的时候需要使用va_alist与va_dcl宏。
va_list ap:这句可以这么理解,ap中将存放所有的形参列表。ap通过va_start(ap)来初始化,使得ap中存在形参。 之后每次调用va_arg(),ap都会自动更新。
va_start:用来初始化形参列表
va_arg(),作用是对一个特定类型额形参列表进行存取。
这里我们使用了vprintf这样的函数,这样的函数可以直接使用va_list类型作为形参。
我们也可以使用stdarg.h进行可变参数函数
再举一个例子:求一系列int数的和。
#include<stdio.h>
#include<stdarg.h>
int sum(unsigned int num, ...)
{
va_list ap;
int sum =0;
va_start(ap,num);
while(num>0)
{
int t;
num--;
t = va_arg(ap,int);
sum+=t;
}
return sum;
}
其中第一个形参代码共有几个数需要求和。va_start()有两个形参。 va_arg()需要显示地提供形参类型。