C语言中可以定义接收不同的参数的函数
可变参数的函数可以接收不同数目的参数,但是需要注意的是c语言中函数的参数个数不能超过5个。
可变参数的函数的原型如下int narg_sum(int arg_num, ... )在参数列表中至少要有一个命名的参数。
可变参数函数的实现需要用到va_start、va_arg、va_end这三个宏和va_list的数据类型,这些宏定义在stdarg.h。
va_list:用来保存宏va_start、va_arg和va_end所需信息的一种类型。为了访问变长参数列表中的参数,必须声明va_list类型的一个对象 。
va_start:访问变长参数列表中的参数之前使用的宏,它初始化用va_list声明的对象,初始化结果供宏va_arg和va_end使用。
va_arg: 展开成一个表达式的宏,该表达式具有变长参数列表中下一个参数的值和类型。每次调用va_arg都会修改 用va_list声明的对象,
从而使该对象指向参数列表中的下一个参数;
va_end:该宏使程序能够从变长参数列表用宏va_start引用的函数中正常返回
实例如下:
#include<stdio.h>
#include<stdarg.h>
//不支持float
int narg_sum(int arg_num, ... )
{
va_list list_arg;
int sum = 0;
int n_num = 0;
va_start(list_arg,arg_num);
for(int i = 0; i < arg_num;i++)
{
n_num = va_arg(list_arg,int);
sum += n_num;
}
va_end(list_arg);
return sum;
}
double args_sum(int init_sum, ... )
{
va_list list_arg;
double sum = init_sum;
va_start(list_arg,init_sum);
sum += va_arg(list_arg, double);
sum += va_arg(list_arg, double);
va_end(list_arg);
return sum;
}
int main(int argc,char** argv)
{
printf("sum = %d\n",narg_sum(3,1,4,5));
printf("sum = %d\n \n",narg_sum(4,6,7,9,8));
printf("sum = %f\n",args_sum(0,3.141592,1));
printf("sum = %f\n",args_sum(4,3.14));
while(1);
return 0;
}
注意,可变参数不能用float变量,在之前写该实例的时候,用了float变量的时候,一直不知道出现了啥问题,后来发现是不支持如下的type类型。
且一般我们要知道怎么该省略的参数的一些参数顺序。如double args_sum函数中的参数类型是int、int和double这三个顺序 。
在给函数传递参数时,参数应该由事先的参数确定类型顺序,同时可以少于之缺省参数的个数,但是类型要匹配。
下面列出va_arg(argp, type)宏中不支持的type:
—— char、signed char、unsigned char
—— short、unsigned short
—— signed short、short int、signed short int、unsigned short int
—— float