Передайте переменное число аргументов в функцию с псевдонимом - PullRequest
1 голос
/ 05 февраля 2010

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

#include <stdio.h>

void console(const char *_sFormat, ...);

int main () {
    console("Hello World!");
    return 0;
}

void console(const char *_sFormat, ...) {
    printf("[APP] %s\n", _sFormat);
}

Если бы я сделал, например, console("Hello %s", sName), я бы хотел, чтобы имя также передавалось в функцию printf, но оно должно иметь возможность продолжать принимать допустимое количество аргументов, как это делает printf.

Ответы [ 2 ]

4 голосов
/ 05 февраля 2010

Вот что вы хотите:

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

void console(const char *_sFormat, ...);

int main () {
    console("Hello World!");
    return 0;
}

void console(const char *_sFormat, ...) {
    va_list ap;
    va_start(ap, _sFormat);
    printf("[APP] ");
    vprintf(_sFormat, ap);
    printf("\n");
    va_end(ap);
}
2 голосов
/ 05 февраля 2010

Будет еще одна проблема (отмеченная gf) - вам, вероятно, следует объединить строку в printf и параметре _sFormat - я сомневаюсь, что printf является рекурсивным - поэтому операторы формата в Первый параметр не будет прочитан!

Следовательно, возможно, такое решение было бы лучше:

#include <stdarg.h>

void console(const char *_sFormat, ...)
{
  char buffer[256];

  va_list args;
  va_start (args, _sFormat);
  vsprintf (buffer,_sFormat, args);
  va_end (args);

  printf("[APP] %s\n", buffer);
}

Используемые типы / функции:

...