How to find the name of the current function at runtime?

后端 未结 7 790
走了就别回头了
走了就别回头了 2021-01-31 15:17

After years of using the big ugly MFC ASSERT macro, I have finally decided to ditch it and create the ultimate ASSERT macro.

I am fine with getting the file and line num

相关标签:
7条回答
  • 2021-01-31 15:38

    You can use the __FUNCTION__ macro which at compile time will be expanded to the name of the function.

    Here's an example of how to use it in an assert macro.

    #define ASSERT(cond) \
        do { if (!(cond)) \
        MessageBoxFunction("Failed: %s in Function %s", #cond, __FUNCTION__);\
        } while(0)
    
    void MessageBoxFunction(const char* const msg,  ...)
    {
        char szAssertMsg[2048];
    
        // format args
        va_list vargs;
        va_start(vargs, msg);
        vsprintf(szAssertMsg, msg, vargs);
        va_end(vargs);
    
        ::MessageBoxA(NULL, szAssertMsg, "Failed Assertion", MB_ICONERROR | MB_OK);
    }
    
    0 讨论(0)
  • 2021-01-31 15:43

    The C++ preprocessor macro __FUNCTION__ gives the name of the function.

    Note that if you use this, it's not really getting the filename, line number, or function name at runtime. Macros are expanded by the preprocessor, and compiled in.

    The __FUNCTION__ macro, like __LINE__, and __FILE__, is part of the language standard, and is portable.

    Example program:

    #include <iostream>
    #using namespace std;
    
    void function1()
    {
            cout << "my function name is: " << __FUNCTION__ << "\n";
    }
    int main()
    {
            cout << "my function name is: " << __FUNCTION__ << "\n";
            function1();
            return 0;
    }
    

    output:

    my function name is: main
    my function name is: function1
    
    0 讨论(0)
  • 2021-01-31 15:43

    In GCC you can use the __PRETTY_FUNCTION__ macro.
    Microsoft also have an equivalent __func__ macro although I don't have that available to try.

    e.g. to use __PRETTY_FUNCTION__ putting something like this at the beginning of your functions and you'll get a complete trace

    void foo(char* bar){
      cout << __PRETTY_FUNCTION__ << std::endl
    }
    

    which will output

    void foo(char* bar)
    

    You also have the __FILE__ and __LINE__ macros available under all standard c/c++ compilers if you want to output even more information.

    In practice I have a special debugging class which I use instead of cout. By defining appropriate environment variables I can get a full program trace. You could do something similar. These macros are incredibly handy and it's really great to be able to turn on selective debugging like this in the field.

    EDIT: apparently __func__ is part of the standard? didn't know that. Unfortunately, it only gives the function name and not the parameters as well. I do like gcc's __PRETTY_FUNC__ but it's not portable to other compilers.

    GCC also supports __FUNCTION__.

    0 讨论(0)
  • 2021-01-31 15:51

    Your macro can contain the __FUNCTION__ macro. Make no mistake, the function name will be inserted into the expanded code at compile time, but it will be the correct function name for each call to your macro. So it "seems like" it happens in run-time ;)

    e.g.

    #define THROW_IF(val) if (val) throw "error in " __FUNCTION__
    
    int foo()
    {
        int a = 0;
        THROW_IF(a > 0); // will throw "error in foo()"
    }
    
    0 讨论(0)
  • 2021-01-31 15:51

    __FUNCTION__ or __FUNC__ or __PRETTY_FUNCTION__

    http://msdn.microsoft.com/en-us/library/b0084kay(VS.80).aspx http://gcc.gnu.org/onlinedocs/gcc/Function-Names.html

    0 讨论(0)
  • 2021-01-31 15:51

    you can easily use func. it will take back you current function name at runtime which raised the exception.

    usage:

    cout << __func__ << ": " << e.what();
    
    0 讨论(0)
提交回复
热议问题