51

我正在尝试编写一个函数,它接受可变数量的参数,如 printf,做一些事情,然后将变量列表传递给 printf。我不知道该怎么做,因为它似乎必须将它们推入堆栈。

大概是这样的

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

有任何想法吗?

4

3 回答 3

60

不要将结果传递给printf. 将它们传递给vprintf. vprintf专门用于处理传入va_list参数。从 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);

注意后者是如何显式地接受va_list参数的,比如你在一个函数...中声明的参数列表。所以你的函数会这样声明:

void forward_args( const char *format , ... ){
   va_list arglist;
   va_start( arglist, format );
   vprintf( format, arglist );
   va_end( arglist );
}
于 2009-11-12T04:16:29.500 回答
5

我很确定您正在寻找va_start()/ vprintf()/ vsnprintf()/ va_end(),无需自己实现这些。

于 2009-11-12T04:14:07.817 回答
2

您会将 arglist 值传递给旨在使用它的函数。有关更多线索,请参阅 stdarg 和 vprintf 文档。

于 2009-11-12T04:04:44.000 回答