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**);
}

これまでに試したこと

...関連する引数のリストを 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

vこれは一般的な解決策ではありませんが、stdio 関数については、 などの文字で始まるものを見てくださいvfprintfva_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 に答える