写交易所CTP代码发现里面有一个宏LOG,接收不定参数并将之打印.而平时自己的代码是用log4cplus写的,准备将LOG通过底层处理交由log4cplus接管.
原始的LOG定义比较简单:
#define LOG(format, ...) fprintf(logfile, format, __VA_ARGS__); printf(format, __VA_ARGS__); fflush(logfile);
在外部定义一个文件,然后支持不定参数,将之打印到文件中完事.
如果需要将之交由log4cplus执行的话,意味着需要先将不定参数解决,然后log4cplus才能处理.
先设计一个全局函数,将不定参数转成str
std::string LogWrite(const char *format, ...)
{
va_list pArgs;
va_start(pArgs, format);
size_t nLength = vsnprintf(NULL, 0, format, pArgs) + 1;
va_end(pArgs);
char * p = NULL;
char buf[2048] = { 0 };
if (nLength > sizeof(buf))
{
char * new_buf = new char[nLength];
memset(new_buf, 0, nLength);
p = new_buf;
}
else {
memset(buf, 0, sizeof(buf));
p = buf;
}
va_list plist;
va_start(plist, format);
vsnprintf(p, nLength, format, plist);
va_end(plist);
std::string str = p;
if (nLength > sizeof(buf))
delete[]p;
return str;
}
然后设计一个宏函数:此函数接口为不定参数,然后通过调用不定参数LogWrite得到转换的str,并调用LOG_INFO将str交由log4cplus去执行.
#define WRITE_LOG(FMT, ...)\
{\
std::string str = LogWrite(FMT, ##__VA_ARGS__);\
LOG_INFO(str);\
}
最后设计用户接口LOG
# define LOG(FMT, ...) WRITE_LOG(FMT, ##__VA_ARGS__)
功能完成.此设计在vs2015, linux gcc4.8.5均编译通过.
参考:
https://www.cnblogs.com/wjshan0808/p/8409773.html, 这儿宏调试日志有所启发