Visual c++ 带参数的格式化日志记录不起作用
我正在用VC++编写VS2012 pro,并试图让我的记录器输出类似这样的内容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
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.