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