0

私はVS2012proを使用してVC++で記述しており、ロガーに次のような出力をさせようとしています。

03/26/2013    Registry()+
03/26/2013    Registry::LoadDWORD("VersionNumber")+;
03/26/2013    Registry(3)-

次のコード行で

RegistryHelper::RegistryHelper()
{
    LogWriter::WriteStart("Registry");
}
bool RegistryHelper::LoadDWORDValue(char* entry, UINT defaultValue, UINT& returnValue)
{
    LogWriter::WriteStart("Registry::LoadDWORD", entry);
    //Code to get DWORD

    LogWriter::WriteEnd("Registry::LoadDWORD", returnValue);
    return true;
}

私がこれまでに持っているコードはこれです

void LogWriter::WriteStart(const char* log, ...)
{
    tcout << log << "(";

    va_list argptr;
    va_start(argptr, log);
    vfprintf(stderr, log, argptr);
    va_end(argptr);

    std::wcout << ")+" << EOL;
}

テストとして私はこれを書きました。

LogWriter::WriteStart("Registry", "Something", "else", "Start", "STop");
char* entry = "VersionNumber";
LogWriter::WriteStart("Registry", entry);
LogWriter::WriteStart("Registry");

しかし、私は戻ってきただけです

2013-03-26.11:41:15 Registry()+
2013-03-26.11:41:15 Registry()+
2013-03-26.11:41:15 Registry()+

しかし、私は戻ってくることを期待しています

2013-03-26.11:41:15 Registry(Something, else, Start, STop)+
2013-03-26.11:41:15 Registry(VersionNumber)+
2013-03-26.11:41:15 Registry()+

いくつか遊んで(主にオンラインからコードを取得して、いくつかの異なることを試してみてください)、私はそれを言うことができましたがRegistry(Registry)+、私が来たのとほぼ同じくらいです。(私はwhileループを使用してNULLをチェックしていました)私はVC ++に少し慣れておらず、paramsの使用に非常に慣れていません(申し訳ありませんが、私はC#の人です)。これは私がそれで遊んで約1時間で得た限りです。私は何が間違っているのですか?

4

3 に答える 3

1

関数に加えて引数の可変数機能を使用しようとしていますが、を呼び出すときに*printfフォーマット指定子(%d、など)を渡していない。%sWriteStart

呼び出しは次のようになります。

LogWriter::WriteStart("Registry %s", entry);

また、ログが生成されている場所から日付を記入するために関数名をハードコーディングする必要はありません。ステートメント:

LogWriter::WriteStart("Registry::LoadDWORD", entry);

簡単に置き換えることができます:

LogWriter::WriteStart(__FUNCTION__, entry); // I am ignoring the format-specifier here

__FUNCTION__プリプロセッサによって完全修飾関数名に置き換えられます。

さらに、これらすべてを処理するマクロを作成することもできます。

#define WRITE_LOG(_smsg) \
   LogWriter::WriteStart(__FUNCTION__ , _smsg);

そしてそれを使用してください:

WRITE_LOG("Your log message"); // Again, I ignore format-specifier here and in macro.

マクロを使用していて、フォーマット指定子で可変引数関数を使用している場合は__VA_ARGS__、マクロ自体と一緒に使用できます。

于 2013-03-27T05:30:17.207 に答える
0

試す

std::cout << log << "(";

va_list argptr;
va_start(argptr, log);
vfprintf(stdout, log, argptr); // use same stream here!
va_end(argptr);

std::cout << ")+" << EOL;
于 2013-03-26T22:11:27.760 に答える
0

より良い-引数として使用したい出力ストリームを渡すだけです:

void LogWriter::WriteStart(FILE *fp, const char* log, ...)
{
    fprintf (fp, "(");
    va_list argptr;
    va_start(argptr, log);
    vfprintf(fp, log, argptr);
    va_end(argptr);
    fprintf (fp, ")\n");
}
于 2013-03-26T23:05:57.383 に答える