3

TraceMessageは、可変数の引数を持つ WinAPI 関数です。これは、Windows トレースでトレース メッセージを生成する、printf に似た表記のトレース関数です。ここで奇妙なのは、専用の引数としてではなく、省略記号の一部としてフォーマット文字列を受け取ることです。この関数を独自の関数で「オーバーライド」することができます。この関数は、TraceMessageVaを呼び出す必要があります(TraceMessage と同じで、省略記号ではなく va_args を使用するだけです)。

ここまでは順調ですね; sprintfしかし今、私は、省略記号からフォーマット文字列を持っているような関数を使用して、トレースされたメッセージにアクセスしたいと考えています。したがって
、省略記号からフォーマット文字列引数を取得する必要があります。
- 最初の引数なしで新しい va_list を作成します。

それをどのように行うかについて何か考えはありますか?Visual Studio コンパイラに固有のソリューションも受け入れられます。ありがとう!

4

1 に答える 1

4

aを使用すると、1 つ以上の引数を抽出するために既に使用しva_listた後に a を取る関数に渡すことができます。その後、will は残りの引数のみを「含む」ように動作します。va_listva_argva_list

私はそれ自体の経験はありませんが、標準とテスト関数TraceMessageを使用した例を示しました。vprintf必要に応じて適応できるはずです。

例えば

#include <stdio.h>
#include <stdarg.h>

void test(int a, ...)
{
    va_list va;
    const char* x;

    va_start(va, a);
    x = va_arg(va, const char*);

    vprintf(x, va);

    va_end(va);
}

int main(void)
{
    test(5, "%d\n", 6);
    return 0;
}
于 2011-04-23T09:38:05.097 に答える