将varargs传递给printf

时间:2014-02-04 00:35:33

标签: c function variadic-functions printf

我希望有一个帮助函数log,基本上可以执行以下操作:

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

我有time部分,我的文件写入部分已关闭。但是,问题是log的方法签名本身 - 我应该放什么? Thisprintf声明以...关键字结尾,但我如何在我的函数中使用它?

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

让我编辑这包含更多信息。

我有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);

我知道vfprintf允许我传递va_list,但我怎样才能将now()作为第一个参数,之前所有其他参数?

2 个答案:

答案 0 :(得分:8)

您要查找的方法是vfprintf或可能vprintf(不清楚哪个问题)

这实际上是printf的实现,它允许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);
}

答案 1 :(得分:8)

使用vprintf,声明为:

int vprintf(const char *format, va_list ap);

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

由于您的log函数需要FILE*个参数,您可能希望使用vfprintf而不是vprintf(并且可能会更新您的问题以询问{{} 1}}而不是fprintf)。

顺便提一下,您可能需要重新考虑使用名称printf;这是log中声明的标准函数的名称。

反映您更新的问题,您可以直接致电<math.h>打印log内的时间戳:

fprintf