c++宏代碼調用不定參數

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

https://gitee.com/sollyu/EasyLog/blob/master/EasyLog.h 簡單日誌

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章