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

我正在尝试编写一个函数,该函数接受可变数量的参数,例如printf,做一些事情,然后将变量列表传递给printf。 我不确定如何执行此操作,因为似乎必须将它们推入堆栈。

大概是这样的

[HTTP://爬上铁.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;
}

有任何想法吗?

Joshua Cheek asked 2020-08-06T22:31:48Z
4个解决方案
54 votes

不要将结果传递给printf,将它们传递给va_list...专门用于处理传递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 );
}
quark answered 2020-08-06T22:31:58Z
4 votes

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

Tim Post answered 2020-08-06T22:32:18Z
2 votes

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

answered 2020-08-06T22:32:38Z
-1 votes

我(不屑一顾)不知道如何实现它。 我建议看一下诸如printf之类的功能的实现。 存在几种开源实现。 glibc,uclibc(不确定bsd和opensolaris为其libc调用/使用什么)。

xenoterracide answered 2020-08-06T22:32:58Z
translate from https://stackoverflow.com:/questions/1719784/c-programming-forward-variable-argument-list