这个问题的英文表达叫做:variadic arguments,方便好奇心强的朋友搜索更多英文内容。
主要就是va_list ,va_start(),va_arg();va_end();
具体背后的原理请参考: C 语言的可变参数表函数的设计.
#include
#include
int add_arbitrary_num(char first_arg,
int arg_num, //没办法,不像printf 那样可以通过格式符 % 判断参数个数
int last_arg, ...)
{
int sum = 0;
va_list variadic_args_list;// va_list is a complete object type suitable for holding the information needed by the macros va_start, va_copy, va_arg, and va_end.
va_start(variadic_args_list, last_arg); // The va_start macro enables access to the variable arguments following the named argument any_value
for(int i = 0; i < arg_num; ++i)
{
sum += va_arg(variadic_args_list, int);// accesses the next variadic function argument
}
va_end(variadic_args_list);//ends traversal of the variadic function arguments
return sum;
}
int main(int argc,char *argv[])
{
int sum = add_arbitrary_num(0,5,0, 1, 2, 3, 4, 5);
printf("sum is:%d\n", sum);
return 0;
}
输出: sum is:15
还有一种方式可以不用限定用户会输入多少个入参,是通过用户可能入参取值范围外的特定值来判断的,比如一个函数可以处理任意数量的非负整数,那么我们就可以这样写:
void variadic_argu_func(char any_thing_1, int any_thing_2, void * any_thing_last,...)
{
va_list variadic_args_list;
va_start(variadic_args_list,any_thing_last);
int argument;
while((argument = va_arg(variadic_args_list,int)) >= 0)
{
;//do something
}
va_end(variadic_arts_list);
}
这样当用户调用函数时,可以在最后传入一个负数作为结束就行了,像这样:
int a;
variadic_argu_func(1,1,(void *)&a, 123,456,789, -1);
variadic_argu_func(1,1,(void *)&a, 123,456,789,9981,3721,1314521, -2016);