2009-11-12 10 views
39

Ich versuche, eine Funktion zu schreiben, die eine variable Anzahl von Parametern wie printf akzeptiert, tut einige Sachen, dann übergibt die Variablenliste zu printf. Ich bin mir nicht sicher, wie ich das machen soll, weil es scheint, als müsste es sie auf den Stapel schieben.C Programmierung: Forward Variable Argumentliste

Etwas ungefähr wie dieses

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

Irgendwelche Ideen?

+4

Vielleicht sind Sie und John in der gleichen Klasse? http://stackoverflow.com/questions/1714550/how-can-one-variable-args-function-call-another –

+2

mögliche Duplikate von [Weiterleiten eines Aufrufs einer Variadic-Funktion in C] (http://stackoverflow.com/questions/150543/forward-an-invocation-von-variadic-function-in-c) – dmckee

Antwort

49

Die Ergebnisse nicht an printf übergeben. Übergeben Sie sie an vprintf. vprintf speziell existiert, um die Übergabe in va_list Argumente zu behandeln. Von Linux-man-Seite:

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

Beachten Sie, wie diese va_list Argumente ausdrücklich annehmen, wie die, die Sie innerhalb einer Funktion deklarieren ... in der Parameterliste unter. So würde Ihre Funktion wie folgt erklärt werden:

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

Nun, er muss auch 'va_start()' und 'va_end()' auch. –

+0

@Ken Bloom: Sie haben Recht. Fest. – quark

+4

'va_start (Argument, Format)' –

2

Sie übergeben den Arglist-Wert an eine Funktion, mit der er verarbeitet werden soll. Weitere Informationen finden Sie in der Dokumentation zu stdarg und vprintf.

-1

Ich bin nicht (von ganz oben) vertraut mit der Umsetzung. Ich würde vorschlagen, eine Implementierung von Funktionen wie printf zu betrachten. Es gibt mehrere Open-Source-Implementierungen. glibc, uclibc (nicht sicher, was bsd und opensolaris für ihre libc aufrufen/verwenden).

3

Ich bin ziemlich sicher, Sie suchen va_start()/vprintf()/vsnprintf()/va_end(), gibt es keine Notwendigkeit, diese selbst zu implementieren.