3

私が取り組んでいるプロジェクトのログ ファイル システムに少し機能を追加したいと考えています。私のLogError()呼び出しには、エラーが発生した関数を含めたいと思います。呼び出した関数の名前にアクセスして、LogError()プログラムでその情報にアクセスしてログに追加できる方法があるかどうか疑問に思っています。

例えば:

bool Engine::GraphicsManager::Initialize(const HWND i_hWindow_main)
{
    if ( !InitializeWindow( i_hWindow_main ) )
    {
        Engine::LogManager::Instance().LogError(L"GraphicsManager::Initialize - Unable to initialize graphics window");
        return false;
    }
    Engine::LogManager::Instance().LogMessage(L"Graphics window initialized successfully");

    /* SNIP */

    initialized = true;
    return true;
}

上記の例では、手動でどこにでもそれを配置するのではなく、その関数の名前 (少なくとも一部)LogError()から呼び出されたことを判断して出力できるようにしたいと考えています。GraphicsManager::Initialize()

EDIT:私のLogError()関数(および他のロギング関数)は基本的にラッパーでvfwprintf_s()あるため、可変長の引数リストを取得できることに言及する必要がありました。「マクロを使用する」という提案は気に入っていますが、その潜在的な問題に対処する方法がわかりません (これはおそらく別の質問です)。

これはまだ合理的/可能ですか?

ありがとう!

4

3 に答える 3

4

関数名の引数を追加して、__FUNCTION__マクロを渡すことができます:http: //msdn.microsoft.com/en-us/library/b0084kay%28v=vs.80%29.aspx

また、自動的にに置き換えられるマクロを定義することもでき...log...()ます...log...(__FUNCTION__)

于 2011-01-30T00:53:13.197 に答える
1

これらは事前定義されたマクロであり、使用できるC /C++標準の一部です。

__FILE__ __LINE__

ここで説明します

于 2011-01-30T00:53:38.860 に答える
0

ロギングマクロを作成する

編集:ワイド文字を処理するためのいくつかの修正

//support macros
#define WIDEN2(x) L ## x
#define WIDEN(x) WIDEN2(x)
#define STRINGIZE(x) #x
#define __WFILE__ WIDEN(__FILE__)
#define __WFUNCTION__ WIDEN(__FUNCTION__)
#define __WLINE__ WIDEN( STRINGIZE(__LINE__) )
// logging macro
#define LOG(msg) Engine::LogManager::Instance().LogError(__WFILE__ L"::" __WFUNCTION__ L":" __WLINE__ L" - " msg)

このように使用してください

if( error ) { LOG(L"Error!"); }

ログ

File.cpp::Function:Line - Error!

これは、Cスタイルの文字列連結を使用して機能します。"aa" "bb"-> "aabb"と、L前に置く演算子の貼り付け"astring"。__FILE __、__ FUNCTION__、および__LINE__マクロを使用して、エラーがログに記録された場所を報告します。STRINGIZE__LINE__は、マクロを使用して文字列に変換されます。規格に準拠していBOOST_PP_STRINGIZEないため、とにかくブーストを使用する予定がある場合はお勧めします。

于 2011-01-30T00:52:47.970 に答える