ログ出力時の呼び出し元関数名を出力する
ログ出力など可変引数を利用して出力している場合、呼び出し元の関数名を出力は容易ではない。
そのために、ゴソゴソしてみた。
出力するログ出力側で、引数で渡せば容易だが、そんなのはめんどくさい!
そんなめんどくさをなくすサンプル。
まずは、__VA_ARGS__マクロ版。__VA_ARGS__は無い場合があるので、要注意。
#include <windows.h> #define LOG_PRINT(x, ...) CLogOut::Out(_T(__FUNCTION__), x, __VA_ARGS__) class CLogOut { public: CLogOut(void) { }; ~CLogOut(void) { }; static void Out(LPCTSTR lpszFuncName, LPCTSTR lpszFormat, ...) { va_list args; va_start(args, lpszFormat); TCHAR szBuffer[1024] = { 0 }; _vstprintf(szBuffer, lpszFormat, args); _tprintf(_T("[%s] %s\n"), lpszFuncName, szBuffer); va_end(args); }; }; int _tmain(int argc, _TCHAR* argv[]) { LOG_PRINT(_T("Test")); LOG_PRINT(_T("many args %d %s %c"), 1, _T("Test"), 'C'); return 0; }
__VA_ARGS__マクロが無い場合は、C++のクラスをうまく利用すると、いい感じにできる。
その場合は、こんな感じ。
#include <windows.h> #define LOG_PRINT CLogOut::CLogOutHelper(_T(__FUNCTION__)).Out class CLogOut { public: class CLogOutHelper { public: CLogOutHelper(LPCTSTR szFuncName) { m_szFuncName = szFuncName; }; void Out(LPCTSTR lpszFormat, ...) { va_list args; va_start(args, lpszFormat); CLogOut::Out(m_szFuncName, lpszFormat, args); va_end(args); }; private: LPCTSTR m_szFuncName; }; public: CLogOut(void) { }; ~CLogOut(void) { }; static void Out(LPCTSTR lpszFuncName, LPCTSTR lpszFormat, va_list args) { TCHAR szBuffer[1024] = { 0 }; _vstprintf(szBuffer, lpszFormat, args); _tprintf(_T("[%s] %s\n"), lpszFuncName, szBuffer); }; }; int _tmain(int argc, _TCHAR* argv[]) { LOG_PRINT(_T("Test")); LOG_PRINT(_T("many args %d %s %c"), 1, _T("Test"), 'C'); return 0; }