C Progtwigción: Lista de argumentos de variables hacia adelante

Intento escribir una función que acepte un número variable de parámetros como printf, haga algunas cosas, luego pasa la lista de variables a printf. No estoy seguro de cómo hacer esto, porque parece que tendría que empujarlos a la stack.

Algo aproximadamente como esto

http://pastie.org/694844

#include  #include  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; } 

¿Algunas ideas?

No pase los resultados a printf . vprintf a vprintf . vprintf existe específicamente para manejar pasar en argumentos de va_list . Desde la página man de Linux:

 #include  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  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); 

Observe cómo este último toma explícitamente argumentos de va_list como los que usted declara dentro de una función tomando ... en la lista de parámetros. Entonces tu función sería declarada así:

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

Estoy bastante seguro de que estás buscando va_start() / vprintf() / vsnprintf() / va_end() , no hay necesidad de implementarlo tú mismo.

Pasará el valor del arglist a una función diseñada para consumirlo. Consulte la documentación de stdarg y vprintf para obtener más pistas.

No estoy (fuera de lo común) familiarizado con la forma de implementar esto. Sugeriría mirar una implementación de funciones como printf. Existen varias implementaciones de código abierto. glibc, uclibc (no estoy seguro de qué bsd y opensolaris invocan / usan para su libc).