Estoy tratando de escribir una función que acepte una cantidad variable de parámetros como printf, haga algunas cosas y luego pase la lista de variables a printf. No estoy seguro de cómo hacer esto, porque parece que tendría que empujarlos a la pila.
Algo así aproximadamente
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;
}
¿Algunas ideas?
No pases los resultados a printf
. pasarlos a vprintf
. vprintf
existe específicamente para manejar el paso en va_list
argumentos Desde la página del manual de 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);
Observe cómo estos últimos toman explícitamente va_list
argumentos como los que declara dentro de una función que toma ...
en la lista de parámetros. Entonces su función se declararía 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 implementarlos usted mismo.
Pasará el valor de la lista de argumentos a una función diseñada para consumirlo. Consulte la documentación de stdarg y vprintf para obtener más pistas.
¿Tal vez tú y John están en la misma clase? stackoverflow.com/questions/1714550/…
–Mark Rushakoff
12 de noviembre de 2009 a las 4:00
posible duplicado de Reenviar una invocación de una función variádica en C
– dmckee — gatito ex-moderador
28 de marzo de 2013 a las 15:33