ログ出力時の呼び出し元関数名を出力する

ログ出力など可変引数を利用して出力している場合、呼び出し元の関数名を出力は容易ではない。
そのために、ゴソゴソしてみた。
出力するログ出力側で、引数で渡せば容易だが、そんなのはめんどくさい!
そんなめんどくさをなくすサンプル。

まずは、__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;
}