我可以通过编程方式访问调用函数的名称吗?

时间:2011-01-30 00:45:13

标签: c++ visual-studio visual-studio-2010 directx-9

我希望为我正在处理的项目添加一些日志文件系统的功能。对于我的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()的包装器,因此它们可以使用可变长度的参数列表。虽然我喜欢“使用宏观”建议,但我不确定如何解决这个潜在问题(这可能是另一个问题)。

仍然合理/可能吗?

谢谢!

3 个答案:

答案 0 :(得分:4)

您可以为函数名称添加参数,并传入__FUNCTION__宏:http://msdn.microsoft.com/en-us/library/b0084kay%28v=vs.80%29.aspx

您还可以定义一个自动将...log...()替换为...log...(__FUNCTION__)的宏。

答案 1 :(得分:1)

这些是预定义的宏,也是您可以使用的C / C ++标准的一部分:

__FILE__ __LINE__

解释了here

答案 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