是的,C语言有可变参数函数的概念,类似于printf()
允许使用可变数量的参数。
一个求最大值的函数可能如下所示:
#include <stdio.h>
#include <stdarg.h>
#include <limits.h>
static int myMax (int quant, ...) {
va_list vlst;
int i;
int num;
int max = INT_MIN;
va_start (vlst, quant);
for (i = 0; i < quant; i++) {
if (i == 0) {
max = va_arg (vlst, int);
} else {
num = va_arg (vlst, int);
if (num > max) {
max = num;
}
}
}
va_end (vlst);
return max;
}
int main (void) {
printf ("Maximum is %d\n", myMax (5, 97, 5, 22, 5, 6));
printf ("Maximum is %d\n", myMax (0));
return 0;
}
这将输出:
Maximum is 97
Maximum is -2147483648
请注意
quant
变量的使用。通常有两种方法来指示您的参数结束,一种是提前计数(即
5
),另一种是在末尾使用哨兵值。
后者的一个例子是指针列表,将
NULL
作为最后一个传递。由于这个
max
函数需要能够处理整个整数范围,因此哨兵解决方案不可行。
printf
函数使用前面的方法,但略有不同。它没有特定的
计数,而是使用格式字符串中的
%
字段来确定其他参数。
max
实现方式... ;) - Dummy00001max()
的作用是返回最大的数字,而不是将它们相加 :P - alexprintf()
似乎不需要知道,但我猜它可以通过计算第一个参数中的所有格式字符来找出。 - alex#define max(...) maxfunction(__VA_ARGS__, INT_MIN)
。 - AndiDogmax(INT_MIN, 0)
是被定义好的。我真的看不出如何安全地传递一个哨兵。 - MSalters