J'essaie d'écrire une fonction qui accepte un nombre variable de paramètres tels que Printf, fait certaines choses, puis transmet la liste de variable à imprimerf. Je ne sais pas comment faire cela, car il semble que cela devrait les pousser sur la pile.
Quelque chose approximativement comme ça
#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;
}
Des idées?
Ne réussissez pas les résultats à printf
. Passez-les à vprintf
. vprintf
existe spécifiquement pour manipuler le passage dans va_list
arguments. De la page Homme 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);
Remarquez comment ces derniers prennent explicitement va_list
arguments tels que ceux que vous déclarez dans une fonction prise ...
Dans la liste des paramètres. 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 mettre en œuvre vous-même.
Vous allez passer le long de la valeur du tableau d'argomple à une fonction conçue pour la consommer. Voir la documentation STDARG et VPRINTF pour plus d'indices.