在计算机程序设计,一个可变参数函数是指一个函数拥有不定引数,即是它接受一个可变数目的参数。不同的编程语言对可变参数函数的支持有很大差异。
一般而言,在设计函数时会遇到许多数学和逻辑操作,是需要一些可变功能。例如,计算数字串的总和、字符串的联接或其他操作过程,都可以存在任意数量的参数。
另一种许多语言都实现为可变参数函数的是格式输出函数,在C语言的printf
函数和Common Lisp的format
函数就是例子。这些函数都需要一个参数,指定格式的输出,再读取可变参数的值进行格式化。
另外,可变参数函数在某些语言存在安全问题。例如C语言在没有长度检查和类型检查,在传入过少的参数或不符的类型时可能会出现溢位的情况,更可能会被利用为攻击目标。所以,在设计函数时可以先考虑其他替补方案,例如以类型安全的方式——重载。
在C语言中,C标准函式库的stdarg.h标头档定义了提供可变参数函数使用的宏。在C++,应该使用标头档cstdarg。
要创建一个可变参数函数,必须把省略号(...)放到参数列表后面。函数内部必须定义一个va_list
变数。然后使用宏va_start
、va_arg
和va_end
来读取。例如:
#include <stdio.h>#include <stdarg.h>double average(int count, ...); /* 函数声明,计算参数的平均值。直到参数为0时停止计算 */int main(void) /* 测试代码 */{ double avg; avg = average(3, 2, 1, 5, 0); printf("%f\n", avg); return 0;}double average(int count, ...){ va_list ap; int i, cnt = 0; /* cnt 表示参数个数 */ double tot = 0; /* 参数的和 */ va_start(ap, count); for (i = count; i; i = va_arg(ap, int), cnt++) /* i为当前获取参数的值 */ tot += i; va_end(ap); /* 将参数列表清空 */ return tot / cnt;}