2009-11-12 11 views
39

Estoy tratando de escribir una función que acepte un número variable de parámetros como printf, hace 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.C Programación: Lista de argumentos de la variable de reenvío

Algo como esto 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; 
} 

¿Alguna idea?

+4

¿Quizás usted y John están en la misma clase? http://stackoverflow.com/questions/1714550/how-can-one-variable-args-function-call-another –

+2

posible duplicado de [Reenviar una invocación de una función variadic en C] (http://stackoverflow.com/questions/150543/forward-a-invocation-of-a-variadic-function-in-c) – dmckee

Respuesta

49

No pasa los resultados a printf. páselos al vprintf. vprintf existe específicamente para manejar pasar en va_list argumentos. Desde la página del 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 tenga explícitamente va_list argumentos como los que se declaran dentro de una función de tomar ... en la lista de parámetros. Entonces su 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); 
} 
+1

Bueno, él necesita 'va_start()' y 'va_end()' también. –

+0

@Ken Bloom: tienes razón. Fijo. – quark

+4

'va_start (arglist, formato)' –

2

Pasarás 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.

-1

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

3

Estoy bastante seguro de que usted está buscando va_start()/vprintf()/vsnprintf()/va_end(), no hay necesidad de poner en práctica estas sí mismo.

Cuestiones relacionadas