📜  C语言中的可变长度参数(1)

📅  最后修改于: 2023-12-03 15:14:27.063000             🧑  作者: Mango

可变长度参数

在C语言中,可以使用可变长度参数实现接受不定数量的参数。这在编写一些灵活的函数时非常有用,比如printf函数就使用了可变长度参数。

可变长度参数函数的定义及调用方式

可变长度参数函数的定义方式如下:

#include <stdarg.h>

return_type function_name(int fixed_arg_num, ...)
{
    va_list arg_list;
    va_start(arg_list, fixed_arg_num);
    /* do something */
    va_end(arg_list);
}

其中,fixed_arg_num 表示固定参数的数量。'...'表示可变数量参数。

接下来是调用方式的示例:

function_name(fixed_arg1, fixed_arg2, ..., variable_arg1, variable_arg2, ...)

函数内部使用可变长度参数需要调用两个宏va_start和va_end,使用va_list类型定义参数列表。

可变长度参数函数的使用

下面来看一个实例。示例中定义了一个可变长度参数函数,计算不同类型变量的总和。

#include <stdio.h>
#include <stdarg.h>
#include <string.h>

int sum(int count, ...)
{
    int result = 0;
    va_list arg_list;
    va_start(arg_list, count);

    for (int i = 0; i < count; i++)
    {
        int value = va_arg(arg_list, int);
        result += value;
    }

    va_end(arg_list);

    return result;
}

int main()
{
    printf("%d\n", sum(1, 1));
    printf("%d\n", sum(2, 1, 2));
    printf("%d\n", sum(3, 1, 2, 3));
    printf("%d\n", sum(4, 1, 2, 3, 4));
    printf("%d\n", sum(5, 1, 2, 3, 4, 5));

    return 0;
}

当函数调用sum(1, 1)时,函数返回值为1。当函数调用sum(2, 1, 2)时,函数返回值为3。当函数调用sum(3, 1, 2, 3)时,函数返回值为6。依此类推。

可以看到,这段代码中,一个int类型参数的值被传递给可变长度参数函数sum,在函数内部,先定义了变量result,初始值为0。传入的参数个数(count)被用来执行循环,每个参数使用va_arg获取,并被加到result上。最后,结果被作为函数的返回值返回。

可变长度参数的注意事项

在使用可变长度参数时,需要注意以下几点:

  1. 可变长度参数中的类型应该为同一种数据类型,如int、double等。
  2. 由于无法判断实参个数和类型是否与定义所使用的相同,所以要防止类型错误,比如使用了va_arg获取一个float类型的参数,但实际传入的是double类型的值。
  3. 可变长度参数需要使用va_start和va_end进行初始化和收尾操作。
参考
  1. 可变长度参数函数 - 廖雪峰的官方网站
  2. stdarg.h库