Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual c++ 带参数的格式化日志记录不起作用_Visual C++_Logging_Variadic Functions - Fatal编程技术网

Visual c++ 带参数的格式化日志记录不起作用

Visual c++ 带参数的格式化日志记录不起作用,visual-c++,logging,variadic-functions,Visual C++,Logging,Variadic Functions,我正在用VC++编写VS2012 pro,并试图让我的记录器输出类似这样的内容 03/26/2013 Registry()+ 03/26/2013 Registry::LoadDWORD("VersionNumber")+; 03/26/2013 Registry(3)- 使用以下代码行 RegistryHelper::RegistryHelper() { LogWriter::WriteStart("Registry"); } bool RegistryHelper

我正在用VC++编写VS2012 pro,并试图让我的记录器输出类似这样的内容

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;
}
但我只回来了

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#guy)。这是我玩了大约一个小时后得到的。我做错了什么?

试试看

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

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

std::cout << ")+" << EOL;

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

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

您正试图在
*printf
函数上使用可变参数数功能,但在调用
WriteStart
时未传递任何格式说明符(如
%d
%s

电话应该是这样的:

LogWriter::WriteStart("Registry %s", entry);
此外,您不需要硬编码函数名,以从生成日志的位置标识。声明:

LogWriter::WriteStart("Registry::LoadDWORD", entry);
可轻松替换为:

LogWriter::WriteStart(__FUNCTION__, entry); // I am ignoring the format-specifier here
\uuuuu函数
将由预处理器用完全限定的函数名替换

此外,您还可以制作一个宏来处理所有这些问题:

#define WRITE_LOG(_smsg) \
   LogWriter::WriteStart(__FUNCTION__ , _smsg);
并使用它:

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

如果您使用的是宏,并且使用带有格式说明符的变量参数函数,则可以将
\u VA\u ARGS\u
与宏本身一起使用

您正在将“Registry()+”写入标准输出。您正在将日志消息写入stderr。它们是两条独立的河流。你确定你在读《史德瑞》吗?也许您的日志记录正确,但只是看不到正确的输出?@paulsm4很好,因为我只重定向wcout和wcerr。。所以我的wcout输出是什么?至于回答我自己,我有两个选择。一个是使用字符串格式的文本(这可能仍然是一个选项),或者第二个是在我的参数中使用整数计数器,因为va_arg不知道它有多少个元素,并且NULL检查不起作用。我曾经尝试过,但没有得到所需的输出。正如Ajay所说,我必须给它一个字符串格式,比如
%s
。我不知道
\uuuu函数\uuuu
,这太神奇了!非常感谢你的提示。这对我帮助很大。我将尝试一下宏,看看它是什么样子。非常感谢。
WRITE_LOG("Your log message"); // Again, I ignore format-specifier here and in macro.