C编程:转发variables参数列表
我试图写一个函数接受像printf可变数量的参数,做一些东西,然后将variables列表传递给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; }
有任何想法吗?
不要将结果传递给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 ); }
我很确定你正在寻找va_start()
/ vprintf()
/ vsnprintf()
/ va_end()
,你不需要自己实现这些。
你会沿着arglist的值传递一个函数来消耗它。 请参阅stdarg和vprintf文档以获取更多线索。
我不是(不在我头顶)熟悉如何实现这一点。 我会build议看看像printffunction的实现。 存在几个开源实现。 glibc,uclibc(不知道什么bsd和opensolaris调用/使用他们的libc)。