本篇博客来介绍一下C语言中不定参数列表的使用方式。
我们通常使用的函数,参数列表都是固定的,如果我们想要使用一个同一个函数,可以传入不同的参数个数,该如果解决呢?
在C++/Java中,我们可以使用函数重载来实现上述问题,但是如果传入的参数个数不能确定,函数重载也没有办法。
下面,我们来看看C语言中是如何实现这个问题的:
C语言中通过一组宏来实现。
-
:定义了一个指针va_list
,用于指示可选的参数。argv
-
:使参数列表指针va_start(argv, argc)
指向函数参数列表中的第一个可选参数,argv
是位于第一个可选参数之前的固定参数,或者说是最后一个固定参数。如有一个函数的声明为:argc
则它的固定参数就是void va_test(int argc, ...);
,最后一个固定参数也是argc
,因此就是argc
。va_start(argv, argc);
-
:返回参数列表中指针va_arg(argv, type)
所指的参数,返回类型为type。并使指针argv
argv
指向参数列表中下一个参数。返回的是可选参数,不包括固定参数。
但是注意,这里的type不能是以下类型:
。char、signed char、unsigned char、short、unsigned short、signed short、short int、signed short int、unsigned short int、float
-
:清空参数列表,并置参数指针va_end(argv)
无效。argv
使用上述的宏,需要包含头文件
stdarg.h
。
我们来看一下这组宏底层的实现:
代码演示:
#include <stdio.h>
#include <stdarg.h>
int sum(int argc, ...) {
int result = 0;
va_list argv;
va_start(argv, argc);
for (int i = 0; i < argc; ++i) {
result += va_arg(argv, int);
}
va_end(argv);
return result;
}
int main() {
int result;
result = sum(5, 1, 2, 3, 4, 5);
printf("result: %d\n", result);
result = sum(7, 1, 2, 3, 4, 5, 6, 7);
printf("result: %d\n", result);
result = sum(10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
printf("result: %d\n", result);
return 0;
}