2

printf最近、ラッパーを実装したいと思いました。いくつかの検索の後、私vprintfはこのニーズに適していることを発見しました:

void my_printf(const char *fmt, ...)
{
    va_list args;
    va_start(args, fmt);
    vprintf(fmt, args);
    va_end(args);
}

しかし、?の代わりに変数引数を使用して、そのようなラッパーprintfまたは他の同様の関数を実装することは可能va_listですか?

(つまり、vバージョンが提供されていない場合はどうなりますか?)


一部のコメンテーターは私の考えを完全に捉えていなかったので、それを詳しく説明したほうがいいです。

printfCライブラリのような単純な関数があるとします。

誰かがあなたにfmt文字列"%d %u %f"と対応する入力を与えます。

ここで、に似た関数を記述しますprintfが、すべて%fを。に置き換え%.2fます。

もちろん、2つのステートメントを使用してタスクを完了することができます。

replace(fmt, "%f", "%.2f");
printf(fmt, inputs);

ただし、この関数を何度も使用する場合は、時間を節約するためにラッパーが必要になる可能性があります。

もちろん、マクロはこのタスクを完了することができます。しかし、次のようなマクロなしで可能ですか?

void myprintf(fmt, ...)
{
    replace(fmt, "%f", "%.2f");
    printf(fmt, inputs);
}

printfここでの問題は、の引数...で内部をフィードする方法がわからないことですmyprintf

これが明らかになることを願っています。

4

2 に答える 2

3

これを使用して出力などに文字列を追加したい場合は、可変個引数マクロを使用できます。

#define MYPRINT(...) printf("toto has: " __VA_ARGS__)

その単純な例では、これは、渡す形式が文字列リテラルであると想定しているため、これは少し制限されています。しかし、このような単純なマクロラッパーの使用方法のパターンをご覧いただければ幸いです。

于 2012-10-18T13:35:23.100 に答える
2

APIがパラメーター付きの関数を提供しない場合、可変個引数関数の呼び出しを作成する移植可能な方法はありませんva_list

ただし、可変個引数呼び出しを作成して実行することにより、その目的でlibffiを[ab]使用することができます。

于 2012-10-18T12:44:24.703 に答える