可变参数是指参数数量是可变的函数,调用该函数时可以传入任意多个实参;创建接收可变参数的函数时,强制要求至少有一个形参在形参列表第一个,可以是任意类型,形参列表最后一个必须是...
,代码如下
1 2 3 4 5 6 7
|
void func(int count, ...) {
}
|
使用可变参数,需要先引入stdarg.h
头文件,可变参数有如下常用的变量类型和方法
Variable | Description |
---|
va_list | 用于存储可变参数的信息,是一个指向可变参数列表的指针,可以按顺序获取参数的值;相当于可变参数的容器 |
Function | Description |
---|
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_list ,src 是要复制的源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_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_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_start(vaList, count);
for (int i = 0; i < count; ++i) { int num = va_arg(vaList, int); printf("num = %d\n", num); }
va_end(vaList); }
|
调用func
1 2 3 4 5 6 7 8 9
| func(5,1,2,3,4,5);
|