C 语言 可变参数 的使用 方法

这个问题的英文表达叫做: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);

你可能感兴趣的:(C,编程基础,c语言)