Отделяйте разные типы аргументов от va_list - PullRequest
1 голос
/ 16 мая 2019

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

Ниже мой код.

Вызов макроса

/* Usage */
PRINT_LOG("Format log = %d, %f, %s", 1, 2.7, "Test");

Мой код ниже

/* my includes here */
#include <stdarg.h>

void printInfo(int level, const char *debugInfo, ...); /* defined in 3rd party API */

void formatLogs(int level, ...);

#define PRINT_LOG(...) formatLogs(0, __VA_ARGS__)

void formatLogs(int level, ...)
{
  va_list args;
  va_start(args, level);

  /* get the first argument from va_list */
  const char *debugString = va_arg(args, const char*);

  /* here I want to get the rest of the variable args received from PRINT_LOG*/
  va_list restOfArgs = ???????; /* restOfArgs should be 1, 2.7, "Test" */

  /* Below I want to send the rest of the arguments */
  printInfo(level, debugString, args);
  va_end(args);
}

Можно ли отправить какую-то часть va_list как va_list другой функции ?? Если да, то как я могу это сделать?

Большое спасибо заранее.

1 Ответ

1 голос
/ 16 мая 2019

Самая простая вещь, основанная на коде в вашем вопросе, это переопределить макрос следующим образом:

#define PRINT_LOG(s, ...) printInfo(0, s, __VA_ARGS__)

и просто полностью пропустите промежуточную функцию. Потому что то, что ты пытаешься сделать, не может быть сделано так.

Многоточие аргумента переменной , ...) равно , а не a va_list. Переменные аргументы, переданные функции, не реализуются как va_list, пока не будет вызван va_start. Чтобы передать va_list в качестве аргумента функции, функция должна иметь va_list в своей подписи, например:

int vprintf(const char *format, va_list argList);
...