C 编程:前向变量参数列表

Posted

技术标签:

【中文标题】C 编程:前向变量参数列表【英文标题】:C Programming: Forward variable argument list 【发布时间】:2010-12-15 17:48:26 【问题描述】:

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

有什么想法吗?

【问题讨论】:

也许你和约翰在同一个班? ***.com/questions/1714550/… Forward an invocation of a variadic function in C的可能重复 【参考方案1】:

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

【讨论】:

好吧,他还需要va_start()va_end() @Ken Bloom:哎呀。我以为我解决了这个问题。道德:不要写累了代码,即使是你只是剪切和粘贴的代码。感谢您了解这一点。 嗨,Ken,我看到了你的名字,我想了大约 15 分钟才弄清楚我是从哪里认出它的……我在 Ruby 邮件列表上见过你 ^_^ 谢谢肯和夸克的帮助。【参考方案2】:

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

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于C 编程:前向变量参数列表的主要内容,如果未能解决你的问题,请参考以下文章

C编程中前向声明的意义是啥?

Python函数总结大全(函数定义,参数种类返回值等)

用 C 语言开发一门编程语言 — Lispy 编程演示

重载的编程语言中的重载

python编程入门之四:列表

python编程入门之四:列表