我希望为我正在处理的项目添加一些日志文件系统的功能。对于我的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()
的包装器,因此它们可以使用可变长度的参数列表。虽然我喜欢“使用宏观”建议,但我不确定如何解决这个潜在问题(这可能是另一个问题)。
这仍然合理/可能吗?
谢谢!
答案 0 :(得分:4)
您可以为函数名称添加参数,并传入__FUNCTION__
宏:http://msdn.microsoft.com/en-us/library/b0084kay%28v=vs.80%29.aspx
您还可以定义一个自动将...log...()
替换为...log...(__FUNCTION__)
的宏。
答案 1 :(得分:1)
答案 2 :(得分: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__宏来报告记录错误的位置。 __LINE__被翻译成带有STRINGIZE
宏的字符串。由于严格遵守标准,如果您计划使用提升,建议使用BOOST_PP_STRINGIZE
。