C Programmation: liste des arguments des variables avant

J’essaie d’écrire une fonction qui accepte un nombre variable de parameters comme printf, fait des choses, puis passe la liste de variables à printf. Je ne suis pas sûr de savoir comment faire cela, car il semble que cela devrait les pousser sur la stack.

Quelque chose comme ça

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

Des idées?

Ne transmettez pas les résultats à printf . transmettez-les à vprintf . vprintf existe spécifiquement pour gérer les arguments va_list . A partir de la page de manuel 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); 

Notez que ces derniers prennent explicitement des arguments va_list tels que ceux que vous déclarez dans une fonction prenant ... dans la liste des parameters. Donc, votre fonction serait déclarée comme ceci:

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

Je suis sûr que vous recherchez va_start() / vprintf() / vsnprintf() / va_end() , il n’est pas nécessaire de les implémenter vous-même.

Vous allez transmettre la valeur de l’argliste à une fonction conçue pour le consumr. Voir la documentation stdarg et vprintf pour plus d’informations.

Je ne suis pas (du haut de ma tête) familier avec la façon de mettre en œuvre cela. Je suggère de regarder une implémentation de fonctions comme printf. Plusieurs implémentations open source existent. glibc, uclibc (pas sûr de ce que bsd et opensolaris appellent / utilisent pour leur libc).