Programação C: lista de argumentos de variables ​​de encaminhamento

Eu estou tentando escrever uma function que aceita um número variável de parâmetros como printf, faz algumas coisas, então passa a lista de variables ​​para printf. Não sei como fazer isso, porque parece que teria que empurrá-los para a pilha.

Algo aproximadamente como este

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

Alguma ideia?

Não passe os resultados para printf . passá-los para vprintf . vprintf existe especificamente para manipular a passagem em argumentos va_list . Na página man do 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); 

Observe como o último toma explicitamente argumentos va_list , como os que você declara dentro de uma function, tomando ... na lista de parâmetros. Então sua function seria declarada assim:

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

Tenho certeza que você está procurando por va_start() / vprintf() / vsnprintf() / va_end() , não há necessidade de implementá-las.

Você estará passando o valor arglist para uma function destinada a consumi-lo. Veja a documentação stdarg e vprintf para mais dicas.

Eu não sou (fora do topo da minha cabeça) familiarizado com a forma de implementar isso. Eu sugeriria olhar para uma implementação de funções como printf. Várias implementações de código aberto existem. glibc, uclibc (não tenho certeza do que o bsd e o opensolaris chamam / usam para sua libc).