可变参数

  可变参数是指参数数量是可变的函数,调用该函数时可以传入任意多个实参;创建接收可变参数的函数时,强制要求至少有一个形参在形参列表第一个,可以是任意类型,形参列表最后一个必须是...,代码如下

1
2
3
4
5
6
7
/**
* @param count 代表可变参数的个数
* @param ... 可变参数
*/
void func(int count, ...) {

}

  使用可变参数,需要先引入stdarg.h头文件,可变参数有如下常用的变量类型和方法

VariableDescription
va_list用于存储可变参数的信息,是一个指向可变参数列表的指针,可以按顺序获取参数的值;相当于可变参数的容器
FunctionDescription
va_start(va_list, int)用于初始化va_list,使其指向可变参数列表的开始位置,该函数需要两个参数:可变参数容器,可变参数个数
va_arg(va_list, type)用于获取va_list指向的当前参数的值,该函数需要两个参数:可变参数的容器,可变参数的变量类型;该函数有返回值,返回值的类型由传入的可变参数的变量类型决定;每调用一次,va_list的指针移动到下一个参数
va_end(va_list)用于清理va_list,确保在函数退出时没有未处理的参数
va_copy(va_list dest, va_list src)该函数接受两个参数,dest是要复制到的va_listsrc是要复制的源va_list。调用va_copy后,dest将指向与src相同的参数列表,并且可以独立地访问和处理这个复制后的参数列表

  具体使用时,先申明一个va_list变量,用于存储可变参数的信息

1
2
3
4
void func(int count, ...) {
// 用于储存可变参数的信息
va_list vaList;
}

  初始化va_list,传入va_list和代表可变参数个数的变量

1
2
3
4
5
6
7
void func(int count, ...) {
// 用于储存可变参数的信息
va_list vaList;

// 初始化 va_list
va_start(vaList, count);
}

  取可变参数的值,va_arg每调用一次,va_list便指向下一个参数,这里使用for将每个参数取数并输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
void func(int count, ...) {
// 用于储存可变参数的信息
va_list vaList;

// 初始化 va_list
va_start(vaList, count);

for (int i = 0; i < count; ++i) {
// 取参数
int num = va_arg(vaList, int);
// 输出参数
printf("num = %d\n", num);
}
}

  清理va_list,确保在函数退出时没有未处理的参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void func(int count, ...) {
// 用于储存可变参数的信息
va_list vaList;

// 初始化 va_list
va_start(vaList, count);

for (int i = 0; i < count; ++i) {
// 取参数
int num = va_arg(vaList, int);
// 输出参数
printf("num = %d\n", num);
}

// 清理 va_list
va_end(vaList);
}

  调用func

1
2
3
4
5
6
7
8
9
// 调用 func ,并传入相应参数
func(5,1,2,3,4,5);

// 将输出
// num = 1
// num = 2
// num = 3
// num = 4
// num = 5