寫交易所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, 這兒宏調試日誌有所啓發