C程序中可变数量的参数

Shu*_*mar 5 c parameters variadic-functions

每当我们在C语言中使用变量参数函数时,我们必须提供参数总数作为第一个参数.有没有什么方法可以在不给出参数总数的情况下使用变量参数创建函数?


[ 评论更新:]

我想使用sum(1,2,3)之类的函数应该返回6.即,不应该有计数器.

hyd*_*yde 7

几种方式:

  • 传递简单明确的计数(在这个问题中你不想要)
  • 传递一些格式字符串,类似于printf和scanf
  • 传递一些"模式"参数,并让每个模式都需要特定的变量
  • 将所有varargs设置为相同类型,并要求最后一个参数为某个特殊值,即AKA 标记值,例如指针列表的NULL或整数类型的类型的最大/最小值,或双精度的NaN.

无论如何,你必须有一些方法让函数知道varargs的类型,以及它知道它们何时结束的方法.C中没有内置方式,参数count不传递给函数.


alk*_*alk 5

我想使用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)