C语言 可变参数

这个最直接的应用就是 printf 这个函数了,如下所示

printf("%d %d %d", 1, 1, 2);

试想一下,如果一个打印函数不能传递多个可变参数,那么这个printf函数要拓展多个个, 很显然每个开发者的需求都不一样,所以参数不可能是写死的,它一定要是可变的,

C语言中的可变参数是通过 在参数后面添加三个点 ... , 当然要使用这个用法, 我们还是需要引入 <stdarg.h> 这个头文件, 它的处理流程如下:

  • 定义一个函数,最后一个参数为省略号,省略号前面可以设置自定义参数。
  • 在函数定义中创建一个 va_list 类型变量,该类型是在 stdarg.h 头文件中定义的。
  • 使用 int 参数和 va_start 宏来初始化 va_list 变量为一个参数列表。宏 va_start 是在 stdarg.h 头文件中定义的。
  • 使用 va_arg 宏和 va_list 变量来访问参数列表中的每个项。
  • 使用宏 va_end 来清理赋予 va_list 变量的内存。

示例:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <setjmp.h>
#include <stdarg.h>

int sum(int number,...)
{
    va_list numberList;
    int rsSum = 0;

    // 为 number 个参数初始化 numberList
    va_start(numberList, number);
    // 访问所有赋给 numberList 的参数
    for (int i = 0; i < number; i++)
    {
       rsSum += va_arg(numberList, int);
    }
    // 清理为 numberList 保留的内存
    va_end(numberList);

    return rsSum;
}

int main()
{
    printf("rs = %d", sum(4, 1, 2, 3, 4));
    return 0;
}

运行结果为

rs = 10