2009-11-12 2 views
39

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

Что-то примерно как этот

http://pastie.org/694844

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

void forward_args(const char *format , ...){ 
    va_list arglist; 
    printf(format, arglist); 
} 


int main (int argc, char const *argv[]){ 
    forward_args("%s %s\n" , "hello" , "world"); return 0; 
} 

Любые идеи?

+4

Возможно, вы и Джон в одном классе? http://stackoverflow.com/questions/1714550/how-can-one-variable-args-function-call-another –

+2

Возможный дубликат [Переслать вызов вариационной функции в C] (http://stackoverflow.com/questions/150543/forward-a-invocation-of-a-variadic-function-in-c) – dmckee

ответ

49

Не сдавайте результаты до printf. передайте их до vprintf. vprintf определенно существует для обработки переданных в va_list аргументов. От человека странице Linux:

#include <stdio.h> 

int printf(const char *format, ...); 
int fprintf(FILE *stream, const char *format, ...); 
int sprintf(char *str, const char *format, ...); 
int snprintf(char *str, size_t size, const char *format, ...); 

#include <stdarg.h> 

int vprintf(const char *format, va_list ap); 
int vfprintf(FILE *stream, const char *format, va_list ap); 
int vsprintf(char *str, const char *format, va_list ap); 
int vsnprintf(char *str, size_t size, const char *format, va_list ap); 

Обратите внимание, как последний явно принимать va_list аргументы, такие как те, вы объявляете внутри функции, принимая ... в списке параметров. Таким образом, ваша функция будет объявлена ​​следующим образом:

void forward_args(const char *format , ...){ 
    va_list arglist; 
    va_start(arglist, format); 
    vprintf(format, arglist); 
    va_end(arglist); 
} 
+1

Ну, ему также нужны 'va_start()' и 'va_end()'. –

+0

@ Ken Bloom: Вы правы. Исправлена. – quark

+4

'va_start (arglist, format)' –

2

Вы передадите значение arglist функции, предназначенной для ее потребления. См. Документацию stdarg и vprintf для получения дополнительных сведений.

-1

Я не (с головы до ног), знакомый с тем, как реализовать это. Я бы предложил посмотреть на реализацию таких функций, как printf. Существует несколько версий с открытым исходным кодом. glibc, uclibc (не уверен, что bsd и opensolaris вызывают/используют для своего libc).

3

Я уверен, что вы ищете va_start()/vprintf()/vsnprintf()/va_end(), нет необходимости реализовывать эти сами.

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