tipos programacion parametros funciones ejemplos basicas c variables arguments printf forward

programacion - tipos de funciones en c++



C ProgramaciĆ³n: Lista de argumentos de variables hacia adelante (4)

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

Algo aproximadamente como esto

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?


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


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


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 <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 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 ); }


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.