44 votes

Programmation C: Liste des arguments de la variable suivante

J'essaie d'écrire une fonction qui accepte un nombre variable de paramètres tels que printf, effectue certaines tâches, puis transmet la liste de variables à printf. Je ne sais pas comment faire cela, car il semblerait que cela devrait les pousser sur la pile.

Quelque chose comme ça

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

Des idées?

54voto

quark Points 7773

Ne transmettez pas les résultats à printf . transmettez-les à vprintf . vprintf existe spécifiquement pour gérer la transmission d'arguments va_list . De la page de manuel 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 cette dernière prend explicitement va_list arguments tels que ceux que vous déclarez dans une fonction prenant ... dans la liste de 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 );
}
 

4voto

Tim Post Points 21270

Je suis presque 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.

-1voto

xenoterracide Points 2557

Je ne suis pas (par hasard) au courant de la façon de mettre en œuvre cela. Je suggérerais de regarder une implémentation de fonctions comme printf. Plusieurs implémentations open source existent. glibc, uclibc (je ne sais pas ce que bsd et opensolaris appellent / utilisent pour leur libc).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X