Shu*_*mar 5 c parameters variadic-functions
每当我们在C语言中使用变量参数函数时,我们必须提供参数总数作为第一个参数.有没有什么方法可以在不给出参数总数的情况下使用变量参数创建函数?
[ 评论更新:]
我想使用sum(1,2,3)之类的函数应该返回6.即,不应该有计数器.
几种方式:
无论如何,你必须有一些方法让函数知道varargs的类型,以及它知道它们何时结束的方法.C中没有内置方式,参数count不传递给函数.
我想使用sum(1,2,3)之类的函数应该返回6.即,不应该有计数器
你可以定义一个哨兵.在这种情况下0可能有意义.
/* Sums up as many int as required.
Stops adding when seeing the 1st 0. */
int sum(int i, ...)
{
int s = i;
if (s)
{
va_list ap;
va_start(ap, i);
/* Pull the next int from the parameter list and if it is
equal 0 leave the while-loop: */
while ((i = va_arg(ap, int)))
{
s += i;
}
va_end(ap);
}
return s;
}
Run Code Online (Sandbox Code Playgroud)
像这样称呼它:
int sum(int i, ...);
int main(void)
{
int s = sum(0); /* Gives 0. */
s = sum(1, 2, 3, 0); /* Gives 6. */
s = sum(-2, -1, 1, 2, 0); /* Gives 0. */
s = sum(1, 2, 3, 0, 4, 5, 6); /* Gives 6. */
s = sum(42); /* Gives undefined behaviour! */
}
Run Code Online (Sandbox Code Playgroud)
该sum()函数也可能看起来像这样(但会添加一个无用的0):
/* Sums up as many int as required.
Stops adding when seeing the 1st 0. */
int sum(int i, ...)
{
int s = i;
if (s)
{
va_list ap;
va_start(ap, i);
/* Pull the next int from the parameter list and if it is
equal 0 leave the do-loop: */
do
{
i = va_arg(ap, int);
s += i;
} while (i);
va_end(ap);
}
return s;
}
Run Code Online (Sandbox Code Playgroud)