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

Jos*_*eek 44 c variables printf arguments 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;
}
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

qua*_*ark 54

不要将结果传递给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);
Run Code Online (Sandbox Code Playgroud)

注意后者如何显式地接受va_list参数,例如你...在参数列表中的函数内声明的参数.所以你的函数将被声明为:

void forward_args( const char *format , ... ){
   va_list arglist;
   va_start( arglist, format );
   vprintf( format, arglist );
   va_end( arglist );
}
Run Code Online (Sandbox Code Playgroud)

  • 好吧,他还需要`va_start()`和`va_end()`. (2认同)

Tim*_*ost 5

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