0

我正在使用 VS2012 pro 用 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++ 有点陌生,对使用参数也很陌生(对不起,我是 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

更好 - 只需传递您希望用作参数的任何输出流:

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 回答
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 回答