代码之家  ›  专栏  ›  技术社区  ›  Canopus

有没有办法在C++函数中获取函数名?

  •  24
  • Canopus  · 技术社区  · 15 年前

    我想实现一个函数跟踪程序,跟踪函数执行所需的时间。我也有以下课程:

    class FuncTracer
    {
        public:
            FuncTracer(LPCTSTR strFuncName_in)
            {
                m_strFuncName[0] = _T('\0');
                if( strFuncName_in ||
                    _T('\0') != strFuncName_in[0])
                {   
                    _tcscpy(m_strFuncName,strFuncName_in);
    
                    TCHAR strLog[MAX_PATH];
                    _stprintf(strLog,_T("Entering Func:- <%s>"),m_strFuncName);
                    LOG(strLog)
    
                    m_dwEnterTime = GetTickCount();
                }
            }
    
            ~FuncTracer()
            {
                TCHAR strLog[MAX_PATH];
                _stprintf(strLog,_T("Leaving Func:- <%s>, Time inside the func <%d> ms"),m_strFuncName, GetTickCount()-m_dwEnterTime);
                LOG(strLog)
            }
    
        private:
            TCHAR m_strFuncName[MAX_PATH];
            DWORD m_dwEnterTime;
    };
    
    void TestClass::TestFunction()
    {
        // I want to avoid writing the function name maually..
        // Is there any macro (__LINE__)or some other way to 
        // get the function name inside a function ??
    
        FuncTracer(_T("TestClass::TestFunction"));
        /*
         * Rest of the function code.
         */
    }
    

    我想知道是否有任何方法可以从函数内部获取函数名?基本上,我希望类的用户只创建相同的对象。它们不能传递函数名。

    3 回复  |  直到 15 年前
        1
  •  21
  •   sharptooth    15 年前

    VC++有

    __FUNCTION__ for undecorated names
    

    __FUNCDNAME__ for decorated names
    

    您可以编写一个宏,它将自己分配一个对象,并在构造函数中传递名为yelding macro的宏。史密斯式

    #define ALLOC_LOGGER FuncTracer ____tracer( __FUNCTION__ );
    
        2
  •  49
  •   Community chadoh    8 年前

    C99 __func__ 但是,对于C++,这将是编译器特有的。另一方面,一些特定于编译器的版本提供了额外的类型信息,当您在模板化的函数/类中进行跟踪时,这一点特别好。

    • MSVC : __FUNCTION__ , __FUNCDNAME__ , __FUNCSIG__
    • GCC : γ函数 , γ函数 , __PRETTY_FUNCTION__

    Boost库已定义宏 BOOST_CURRENT_FUNCTION 对于头中的大多数C++编译器 boost/current_function.hpp . 如果编译器太旧,无法支持此操作,则结果将为“(未知)”。

        3
  •  3
  •   David Z    15 年前

    我本来想说我不知道这件事,但后来我看到了其他的答案…

    您可能会感兴趣的是知道执行分析器(例如 gprof )完全按照您的要求执行-它跟踪执行每个函数所花费的时间。探查器的基本工作原理是每隔10毫秒左右记录一次指令指针(IP),即当前执行指令的地址。程序运行完成后,调用后处理器,检查IP和程序列表,并将这些地址转换为函数名。所以我建议只使用指令指针,而不使用函数名,这两个原因都是代码更容易,而且使用单个数字比使用字符串更有效。