C++ 我希望使用宏多参数始终为null来跟踪日志。问题c++;窗户
我使用以下方法计算函数的时间:C++ 我希望使用宏多参数始终为null来跟踪日志。问题c++;窗户,c++,windows,logging,macros,C++,Windows,Logging,Macros,我使用以下方法计算函数的时间: #define TIME_COST(message, ...)\ char szMessageBuffer[2048] = {0};\ va_list ArgList;\ va_start(ArgList, message);\ vsprintf_s(szMessageBuffer, 2048, message, ArgList);\ va_end(ArgList); \ string strMessage(szMessageBuffer);\ CQ
#define TIME_COST(message, ...)\
char szMessageBuffer[2048] = {0};\
va_list ArgList;\
va_start(ArgList, message);\
vsprintf_s(szMessageBuffer, 2048, message, ArgList);\
va_end(ArgList); \
string strMessage(szMessageBuffer);\
CQLogTimer t(strMessage);
//CQLogTimer是一个自毁程序,它将结束自己的生命周期并打印szMessageBuffer。
但是,当我使用宏时:
void fun
{
TIME_COST("hello->%s", filePath);
XXXXXX
}
生成的消息始终为hello->(空)
有人能帮忙吗?
非常感谢 宏不是可变函数,您不需要使用
va.*
函数处理参数列表。宏只是转换源代码的文本
话虽如此,您的编译器(我假设是MSVC)支持带有\uu VA\u ARGS\uu
的可变宏:
#define TIME_COST(fmt, ...)\
char szMessageBuffer[2048] = {0};\
sprintf_s(szMessageBuffer, 2048, fmt, __VA_ARGS__);\
string strMessage(szMessageBuffer);\
CQLogTimer t(strMessage);
正确的版本是:
#define TIME_COST(message, ...)\
char szMessageBuffer[2048] = {0};\
sprintf_s(szMessageBuffer, 2048, message, __VA_ARGS__);\
string strMessage(szMessageBuffer);\
CQLogTimer t(strMessage);
\uuuu-VA\u-ARGS\uuuuu>不是VA\u-list
类型,而是逗号分隔的参数,因此您需要使用sprintf\u-s
,而不是vsprintf\u-s
另一种日志记录方法是使用流:
#define LOG( msg ) \
{ \
ostringstream os; \
os << msg; \
CDLogTimer( os.str() ); \
}
#定义日志(msg)\
{ \
ostringstream os\
os为什么要使用宏(以及为什么要使用变量参数)?当然有更安全的方法来进行日志记录。因为我想在发布模式下完全清除它。假设时间成本(“hello->%s”,filePath)调用,您的代码不会编译-错误C2664:'int-vswprintf_s(wchar\u t*,size\u t,const-wchar\u t*,va\u list)“:无法将参数4从“”转换为'va_list'@AOI Karasu,是的,错过了那个。我从来都不喜欢这种流式语法,也不知道为什么。不过,您的版本看起来比使用sprintf_s的版本整洁多了。
LOG( "the value of x is " << x << " and of y is " << y );