Czy istnieje sposób na uzyskanie nazwy funkcji wewnątrz funkcji C++?

Chcę zaimplementować znacznik funkcji, który śledzi ile czasu zajmuje wykonanie funkcji. Mam następujące zajęcia dla tego samego: -

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.
     */
}

Chcę wiedzieć, czy jest jakiś sposób, aby uzyskać nazwę funkcji z wnętrza funkcji? Zasadniczo chcę, aby użytkownicy mojej klasy po prostu stworzyli taki sam obiekt. Mogą nie przekazać nazwy funkcji.

Author: sharptooth, 2009-04-09

3 answers

VC++ ma

__FUNCTION__ for undecorated names

I

__FUNCDNAME__ for decorated names

I możesz napisać makro, które samo przydzieli obiekt i przekaże makro o nazwie-yelding wewnątrz konstruktora. Smth jak

#define ALLOC_LOGGER FuncTracer ____tracer( __FUNCTION__ );
 21
Author: sharptooth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-09 06:38:26

C99 mA __func__, ale dla C++ będzie to specyficzne dla kompilatora. Z drugiej strony, niektóre wersje kompilatora dostarczają dodatkowych informacji o typie, co jest szczególnie przydatne, gdy śledzisz wewnątrz templatyzowanej funkcji/klasy.

  • MSVC: __FUNCTION__, __FUNCDNAME__, __FUNCSIG__
  • GCC: __func__, __FUNCTION__, __PRETTY_FUNCTION__
Biblioteka Boost definiuje makro BOOST_CURRENT_FUNCTION dla większości kompilatorów C++ w nagłówku boost/current_function.hpp . Jeśli kompilator jest za stary, aby to poprzeć, wynik będzie "(nieznany)".
 47
Author: bk1e,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-13 16:53:44

Chciałem powiedzieć, że nic o tym Nie wiem, ale potem zobaczyłem inne odpowiedzi...

Może Cię zainteresować, że Profiler wykonania (jak gprof) robi dokładnie to, o co prosisz - śledzi ilość czasu spędzonego na wykonywaniu każdej funkcji. Profiler zasadniczo działa poprzez zapisanie wskaźnika instrukcji (IP), adresu aktualnie wykonywanej instrukcji, co około 10 ms. Po uruchomieniu programu wywołujesz postprocesor, który bada lista adresów IP i programu oraz konwertuje te adresy na nazwy funkcji. Więc sugerowałbym użycie wskaźnika instrukcji, a nie nazwy funkcji, zarówno dlatego, że łatwiej jest kodować, jak i dlatego, że bardziej wydajna jest praca z pojedynczym numerem niż z łańcuchem znaków.

 3
Author: David Z,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-04-09 06:43:29