Как бы я использовал оператор `...` C, чтобы получить функцию для вывода всех ее аргументов? - PullRequest
5 голосов
/ 30 ноября 2010

Вот что я попробовал ... но не получилось:

void testfunc(...){
    printf(...);
}

Ответы [ 3 ]

3 голосов
/ 30 ноября 2010

Это создаст функцию, эквивалентную printf.Обратите внимание, что вы не можете выводить аргументы вслепую, так как вам каким-то образом нужно заранее знать, к какому типу относится каждый аргумент.Аргумент format для printf сообщает ему, какие аргументы ожидать и какими они будут типами.

#include <stdargs.h>

void testfunc(const char *format, ...)
{
    va_list ap;
    va_start(ap, format);

    vprintf(format, ap);

    va_end(ap);
}
2 голосов
/ 30 ноября 2010

Вы должны использовать va_start(), va_end(), va_arg() и (не всегда) va_list и у вас должен быть хотя бы один постоянный определенный аргумент! Например:

#include <stdio.h>
#include <stdarg.h>

void PrintFloats ( int amount, ...)
{
  int i;
  double val;
  printf ("Floats passed: ");
  va_list vl;
  va_start(vl,amount);
  for (i=0;i<amount;i++)
  {
    val=va_arg(vl,double);
    printf ("\t%.2f",val);
  }
  va_end(vl);
  printf ("\n");
}

int main ()
{
  PrintFloats (3,3.14159,2.71828,1.41421);
  return 0;
}
1 голос
/ 30 ноября 2010

Вы можете использовать макросы va_start() и va_end(), но у вас должен быть хотя бы один аргумент:

void testfunc(int n, ...)
{
    va_list vl;
    va_start(vl, n); // initialize the va_list
    // something useful
    va_end(vl); // deinitializes vl
}

Вы можете последовательно получить доступ к аргументам с помощью va_arg(vl, type) (например, int x = va_arg(vl, int)). Кроме того, va_copy иногда полезен, если вы хотите скопировать текущее состояние va_list

...