1

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

#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.

+0

Я использую Visual C++ 2008 Express Edition –

+2

Вы, вероятно, хотите, чтобы сцепить ' "[APP]"' и '_sFormat'. –

+1

@gf - о, да, хороший момент! –

ответ

4

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

#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); 
} 
+0

У вас есть плюс для компиляции :). –

+1

Он также работает: попробуйте консоль («Hello% s», «World!»); ;-) –

+0

Я тоже дал вам это сэр, отличный ответ, и он работает фантастически хорошо, и я могу работать с ним для некоторых других функций. @ Kornel Kisielewicz, вы, где большая помощь. Спасибо за ваш оригинальный ответ и за руку, которую вы сделали с объяснением того, что все сделали. Очень полезно. –

2

Там будет еще одна проблема (отмеченное ГФ) - вероятно, вы должны сцепить строки в 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); 
} 

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

+0

1>. \ File.cpp (43): ошибка C2065: 'c': необъявленный идентификатор 1>. \ File.cpp (43): ошибка C3861: 'va_start': идентификатор не найден 1>. \ File. cpp (47): ошибка C3861: 'va_end': идентификатор не найден –

+1

@Mark, вы забыли '#include '? –

+0

Видимо, большое спасибо за это. Все еще получая необъявленный идентификатор для 'c' tho. (Спасибо, что взяли меня за это.) –

Смежные вопросы