将varargs传递给printf

wch*_*gin 12 c printf function variadic-functions

我想要一个辅助函数log,基本上执行以下操作:

log(file, "array has %d elements\n", 10);
// writes "2014-02-03 16:33:00 - array has 10 elements" to &file
Run Code Online (Sandbox Code Playgroud)

我有时间部分,我有文件写入部分.然而,问题是方法签名本身log- 我应该放什么?这表示printf声明以...关键字结束,但我如何在我的函数中使用它?

void log(FILE *f, const char * format, ...) // how would I pass ... to fprintf?
Run Code Online (Sandbox Code Playgroud)

让我编辑这个包含更多信息.

我有一个const char * now ()返回"2014-02-03 16:33:00"形式的字符串.我想像这样传递另一个格式字符串.这两个陈述应该是等同的:

log(file, "array has %d elements\n", 10);
fprintf(file, "%s - array has %d elements\n", now(), 10);
Run Code Online (Sandbox Code Playgroud)

我知道这vfprintf可以让我通过va_list,但我怎么能把它now()作为第一个参数,在所有其他之前?

Jar*_*Par 9

您正在寻找的方法是vfprintf或可能的vprintf(不清楚您的问题是哪一个)

这基本上printf是允许将a va_list作为参数显式传入的实现.因此,在您的方法中,您可以创建va_list方法参数并将其转发到vfprintf

void log(FILE* f, const char* format, ...) { 
  va_list args;
  va_start (args, format);
  vfprintf (f, format, args);
  va_end (args);
}
Run Code Online (Sandbox Code Playgroud)


Kei*_*son 9

使用vprintf,声明为:

int vprintf(const char *format, va_list ap);
Run Code Online (Sandbox Code Playgroud)

在您的log函数中,调用va_start以获取va_list值,然后将该值传递给vprintf.

由于你的log函数需要FILE*参数,你可能想要使用vfprintf而不是vprintf(并且可能更新你的问题fprintf而不是printf).

顺便说一下,您可能想重新考虑使用该名称log; 这是在中声明的标准函数的名称<math.h>.

反映您更新的问题,您可以直接log打电话打印时间戳fprintf:

va_list(args);
fprintf(f, "%s - ", now());
va_start(args, format);
vfprintf(f, format, args);
Run Code Online (Sandbox Code Playgroud)