天天看点

『C语言』不定参数列表

本篇博客来介绍一下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

我们来看一下这组宏底层的实现:

『C语言』不定参数列表
『C语言』不定参数列表
『C语言』不定参数列表

代码演示:

#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;
}
           
『C语言』不定参数列表