2011-01-30 15 views
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

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

そして、あなたはまた、自動的に...log...(__FUNCTION__)...log...()を置き換えますマクロを定義することができます。

+0

私は可変長引数リストを処理する必要があると言うことは、私のオリジナルのポストを更新しました。より複雑なタスクにマクロを使用することにはあまり慣れていません。追加の警告が表示されたままでもこれを行うことはできますか? – chaosTechnician

+0

@chaosTechnician:何も見逃していない場合は、書式設定引数の前に関数名引数を渡すだけです。個人的には、有用な情報(行番号、ファイル名)の各ビットの引数とメッセージの引数を渡します。ロギングはすべてをフォーマットします。 –

0

ログインマクロ

EDITください:ワイド文字に対処するためのいくつかの修正

//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__マクロを使用して、エラーがどこから記録されたかを報告します。 __LINE__は、STRINGIZEマクロを持つ文字列に変換されます。とにかくブーストを使用する予定がある場合は、標準との間違った遵守のためにBOOST_PP_STRINGIZEをお勧めします。

1

これらのユーザーが使用できる定義済みマクロおよびC/C++標準の一部です:

__FILE__ __LINE__ 

彼らはhereを説明しているが

関連する問題