web-dev-qa-db-fra.com

C Programmation: liste d'arguments variable avant

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

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?

45
Joshua Cheek

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 );
}
53
quark

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.

4
Tim Post

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.

2
user202929