C编程:转发变量参数列表

时间:2009-11-12 03:57:07

标签: c variables arguments printf forward

我正在尝试编写一个接受可变数量参数的函数,比如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 个答案:

答案 0 :(得分:53)

不要将结果传递给printf。将它们传递给vprintfvprintf专门用于处理传递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 );
}

答案 1 :(得分:4)

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

答案 2 :(得分:2)

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

答案 3 :(得分:-1)

我不是(在我的头脑中)熟悉如何实现这一点。我建议看一下像printf这样的函数的实现。存在几种开源实现。 glibc,uclibc(不确定bsd和opensolaris调用/使用他们的libc)。