2009-11-12 43 views
39

我想写一个函数,接受可变数量的参数,如printf,做一些东西,然后将变量列表传递给printf。我不知道如何做到这一点,因为它似乎必须将它们推入堆栈。C编程:转发变量参数列表

东西大约是这样

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

也许你和约翰在同一班? http://stackoverflow.com/questions/1714550/how-can-one-variable-args-function-call-another – 2009-11-12 04:00:45

+2

可能的重复[在C中转发一个可变参数函数的调用](http://stackoverflow.com/questions/150543/forward-an-invocation-of-a-variadic-function-in-c) – dmckee 2013-03-28 15:33:45

回答

49

不要将结果传递给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

呃,他还需要'va_start()'和'va_end()'。 – 2009-11-12 04:36:30

+0

@ Ken Bloom:你说得对。固定。 – quark 2009-11-12 04:42:31

+4

'va_start(arglist,format)' – 2009-11-12 14:54:05

2

您将沿着arglist值传递函数来设计消耗它。有关更多线索,请参阅stdarg和vprintf文档。

-1

我并不熟悉如何实现这一点。我会建议看一下像printf这样的函数的实现。存在几个开源实现。 glibc,uclibc(不知道bsd和opensolaris调用/用于他们的libc)。

3

我很确定你在找va_start()/​​/vsnprintf()/va_end(),没有必要自己实现这些。