Подтвердить что ты не робот

Можно ли написать функцию varargs, которая отправляет список аргументов в другую функцию varargs?

Возможный дубликат:
Программирование на C: список аргументов переадресации.

То, что я хотел бы сделать, - отправить данные в библиотеку протоколирования (которую я не могу modfify) в виде printf.

Итак, мне нужна функция вроде этого:

void log_DEBUG(const char* fmt, ...) {
   char buff[SOME_PROPER_LENGTH];
   sprintf(buff, fmt, <varargs>);
   log(DEBUG, buff);
}

Можно ли каким-то образом передать varargs в другую функцию vararg?

4b9b3361

Ответ 1

Вы не можете переслать список аргументов переменных, так как нет способа выразить то, что под ... в качестве параметра (ов) к другой функции.

Однако вы можете построить va_list из параметров ... и отправить его функции, которая будет отформатировать ее правильно. Это то, что для vsprintf. Пример:

void log_DEBUG(const char* fmt, ...) {
   char buff[SOME_PROPER_LENGTH];
   va_list args;
   va_start(args, fmt);
   vsprintf(buff, fmt, args);
   va_end(args);
   log(DEBUG, buff);
}

Ответ 2

Вы можете отправить его другой функции, которая принимает va_list в качестве аргумента. Другого пути, кроме использования ручной работы, не существует, или делать какую-то ужасающую гадательную игру, чтобы выяснить "число" параметров.

Это будет работать:

void log_DEBUG(const char* fmt, ...)
{
  va_list va;
  va_start(va,fmt);
  char buff[blah];
  vsprintf(buff,fmt,va);
  log(DEBUG,buff);
  va_end(va);
}

В принципе, всякий раз, когда вы пишете функцию, которая принимает..., вы должны написать другую версию, которая принимает va_list - это вежливая вещь, которую нужно сделать, если вы хотите включить этот тип цепочки вызовов.

Ответ 3

Вот почему у вас есть семейство функций vprintf.

Ответ 4

Для вашего конкретного требования вы можете использовать vsprintf. Мой C/С++ слишком ржавый, чтобы напомнить, если есть простой способ сделать это, когда другая функция не предназначена для него (не попадая в уродливую манипуляцию с стеком), но я склонен думать не об этом.

Ответ 5

Не в стандартном С++.