在C语言中要想实现可变参数的写法,就要先知道stdarg这个头文件中的两个宏va_start,va_arg,va_end以及一个类型va_list。
va_list这个类型用于声明一个可变参数的列表指针。
va_start用于初始化可变参数列表指针,令它指向可变参数列表的第一个值。
va_arg用于返回参数的值,并且令可变参数的列表的指针指向下一个参数。
va_end用于结束可变参数指针。
在声明函数的时候则需要这样做:
void Variable_parameter_function(int num,...);
综上所述,通过一个就平均数的函数做例子:
#include "stdio.h"
#include "stdarg.h"
float Average(int num,...){
va_list Para_list; //声明一个可变参数列表指针
int cnt;
float sum;
va_start(Para_list,num); //初始化可变参数列表指针,使其指向紧跟num后的那个参数
for(cnt=0;cnt<num;cnt++){
sum += va_arg(Para_list,int); //将可变参数列表中的值以int类型返回,并将可变参数列
//表指针指向下一个值。
}
va_end(Para_list);
return sum/num;
}
接下来就来试着写一下自己的printf函数,首先printf的用法是printf("Output_int:%d,Output_char:%c,Out_put_str:%s",i,c,s);
按照可变参数函数的写法,上面printf函数的变化部分就是后面的变量部分,而第一部分实际上就是一个字符串,
所以我们的printf函数声明就是:
void myprintf(char * string,...){
va_list ap;
va_start(string,ap);
int i;
char c;
char* s;
while( string != NULL){
if (* string != '%'){
putchar(*string);
string++;
}
else{
switch(* string ){
case 'd':
i=va_arg(ap,int);
putint(i);
string++;
break;
case 'c':
c=va_arg(ap,char);
putchar(c);
string++;
break;
case 's':
s=va_arg(ap,char *);
putstring(ap,s);
string++;
break;
default:
string++;
}
}
}
va_end(ap);
}
以上仅仅是一个很简陋的printf的实现方式,并不是很完美,但是足以用来说明可变参数函数的写法了。