我想跟踪使用macros多参数始终为空的日志。 问题的c + +窗口

我正在使用以下方法来closures一个函数的时间:

#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。 但是,当我使用这个macros

 void fun { TIME_COST("hello->%s", filePath); XXXXXX } 

生成的消息总是hello – >(null)

任何人都可以帮忙吗? 非常感谢!

Solutions Collecting From Web of "我想跟踪使用macros多参数始终为空的日志。 问题的c + +窗口"

正确的版本是:

 #define TIME_COST(message, ...)\ char szMessageBuffer[2048] = {0};\ sprintf_s(szMessageBuffer, 2048, message, __VA_ARGS__);\ string strMessage(szMessageBuffer);\ CQLogTimer t(strMessage); 

__VA_ARGS__不是va_list类型,而是逗号分隔的参数,所以您需要使用sprintf_s而不是vsprintf_s

不同的日志记录方法是使用流:

 #define LOG( msg ) \ { \ ostringstream os; \ os << msg; \ CDLogTimer( os.str() ); \ } 

你可以这样说:

 LOG( "the value of x is " << x << " and of y is " << y ); 

宏不是可变函数,你不需要用va_*函数处理参数列表。 宏只是转换源代码的文本。

这就是说,你的编译器(我假设的MSVC)支持__VA_ARGS____VA_ARGS__

 #define TIME_COST(fmt, ...)\ char szMessageBuffer[2048] = {0};\ sprintf_s(szMessageBuffer, 2048, fmt, __VA_ARGS__);\ string strMessage(szMessageBuffer);\ CQLogTimer t(strMessage);