本篇博客来介绍一下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)
:返回参数列表中指针argv
所指的参数,返回类型为type。并使指针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;
}