设计可变参数数目的函数的主要难度在于要自己手动从栈中提取参数,但这些有现成的宏定义可以用,在<stdarg.h>和<stdargs.h>中。
下面是一个例子,sum()的功能是任意数量的整数求和。
sum()第一个参数是要求和的数的个数,后面跟着若干整型参数。如果实参个数小于第一个参数num的数值,sum()行为不确定。
也可以不用num而设置一个参数结束标志(比如最后一个参数为-1等),但也有同样的问题。说白了就是你必须给函数一个知道参数个数的方法,否则函数无法知道你到底在调用的时候给了几个实参。
#include <stdio.h>
#include <stdarg.h>
int sum(int num, ...)
{
va_list parg;
int arg;
int s;
int i;
va_start(parg, num);
for (s = 0, i = 0; i < num; i++)
{
arg = va_arg(parg, int);
s += arg;
}
va_end(parg);
return s;
}
int main(int argc, char* argv[])
{
printf("%d\n", sum(1, 1)); // 1
printf("%d\n", sum(2, 1, 2)); // 1 + 2
printf("%d\n", sum(3, 1, 2, 3)); // 1 + 2 + 3
printf("%d\n", sum(4, 1, 2, 3, 4)); // 1 + 2 + 3 + 4
return 0;
}