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

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" 以及粘贴到 put Lbefore的一些运算符"astring"。它使用 __FILE__、__FUNCTION__ 和 __LINE__ 宏来报告记录错误的位置。STRINGIZE__LINE__ 用宏翻译成字符串。由于对标准的严格遵守,BOOST_PP_STRINGIZE如果您仍然打算使用 boost,建议您使用。

于 2011-01-30T00:52:47.970 回答