0

老客户代码:

printf("foo: %d, bar: %s.\n", f, b);

我想用以下内容替换 printf (以及 100 个其他人喜欢的):

my_printf(ctrl1, ctrl2, "foo: %d, bar: %s.\n", f, b);

my_printf 的实现

void my_printf(CtrlT1 c1, Ctrl c2, char* fmt, ...) {
/* Do stuff with c1 & c2 */
   fprintf(log, fmt, **WHAT_GOES_HERE**);
}

到目前为止我尝试过的

似乎应该有一种简单、直接的方法将与...through 关联的参数列表传递给 fprintf。我试过fprintf(log, fmt, ...);了,但编译器抱怨说,“'...' 标记之前的语法错误”。

我也试过: va_list ap; va_start(ap, fmt); fprintf(log, fmt, ap);

带有 va_list 的调用可以编译,甚至可以在没有核化的情况下运行,但是传递给 printf 的内容显然与传递给我的函数 as 的内容不同...,这可以通过输出(非打印字符的表示)来判断。

如果迫在眉睫,我可能会通过蛮力遍历 va_list 的内容,但这似乎很愚蠢。没有简单的令牌或语法可以...通过吗?

4

1 回答 1

5

这不是通用解决方案,但对于 stdio 函数,请查看以字母开头的函数,v例如vfprintf. 他们将 ava_list作为最后一个参数,而不是....

void my_printf(CtrlT1 c1, Ctrl c2, char* fmt, ...) {
    /* Do stuff with c1 & c2 */
    va_list ap;
    va_start (ap, fmt);
    vfprintf (log, fmt, ap);
    va_end (ap);
}
于 2013-05-09T22:12:33.997 回答