2011-01-30 49 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()和輸出調用(至少部分),該函數的名稱,而不是把那無處不在。

編輯:我應該提到,我LogError()功能(和其他記錄功能)基本上包裝器vfwprintf_s(),使他們能夠採取可變長度參數列表。雖然我喜歡「使用宏觀」建議,但我不確定如何解決這個潛在問題(這可能是另一個問題)。

這是還是合理/可能嗎?

謝謝!

回答

4

您可以添加一個參數的函數名,並通過在__FUNCTION__宏:http://msdn.microsoft.com/en-us/library/b0084kay%28v=vs.80%29.aspx

而且你還可以定義一個宏,將自動...log...(__FUNCTION__)替換...log...()

+0

更新我原來的職位說,我需要處理可變長度參數列表。我不太熟悉將宏用於更復雜的任務。這仍然可以完成額外的警告? – chaosTechnician 2011-01-30 01:37:34

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! 

這是通過USI ng C風格的字符串連接。 「aa」,「bb」 - >「aabb」以及一些粘貼操作員將L放在"astring"之前。它使用__FILE__,__FUNCTION__和__LINE__宏來報告錯誤記錄的位置。 __LINE__被翻譯成一個帶有STRINGIZE宏的字符串。由於蹩腳的符合標準,如果您計劃使用boost,建議使用BOOST_PP_STRINGIZE

1

這些預定義的宏和C/C++標準的一部分,您可以使用:

__FILE__ __LINE__ 

他們解釋here

相關問題