C语言可变参数

一、引入

在C语言中,我们可能会遇到一个函数的参数是不确定的情况,比如C语言内置的printf()函数,它里面的参数可以是一个,也可以是两个,或者更多,那么我们自己定义的函数该如何实现这种可变参数的功能呢?这就要使用<stdarg.h>中的va_list va_start va_arg va_end来解决了。

二、使用方式

首先我们在定义函数的时候,用...来代表我们的可变参数。

1
2
3
int sum1(int n, ...); // 这三种方式都可以
int sum2(int n...);
int sum3(...);

然后我们在函数的内部定义一个va_list的变量,使用va_start函数来连接到这些可变参数

1
2
va_list vaList; // 一个va_list 类型的变量
va_start(vaList, n); // 第二个参数是可变参数的个数,这个个数一定要准确,如果只传入了4个,但读取了第五个,就会出现一些“野”数据

连接后,我们使用va_arg来访问这些可变参数

1
va_arg(vaList, int); // 第二个参数就是可变参数的类型,va_arg会逐个取出这种类型的参数。比如,int,不会取出其中的double类型的参数

使用后,要记得使用va_end()来释放内存,防止内存泄漏

1
va_end(vaList); // 释放

一个例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
#include <stdio.h>
#include <stdarg.h>
using namespace std;

int sum1(int n, ...);
int sum2(int n...);
int sum3(...);

int sum1(int n, ...) // 整数求和函数,n是个数
{
va_list vaList; // 定义va_list
va_start(vaList, n); // 链接到这些参数

int sum = 0;
while (n--)
{
sum += va_arg(vaList, int); // 逐个取出参数
}
va_end(vaList); // 释放

return sum;
}

int main()
{
cout << sum1(5, 1.0f, 2, 3, 4, 5); // 输出14,因为只取出了int类型的
return 0;
}