Predefined Macros for function name __func__
c++, c-preprocessor, gcc, visual-studio
Solution
You're assuming `__func__` is a macro, but it's not. It's a conditionally-supported predefined identifier, so you can't check it with `#if defined` or `#ifdef`.
If the compilers have no way of telling you whether this is supported (they could via a `_FUNC_SUPPORTED` or something, I'm not saying they actually are doing this), you'll have to check the compiler instead of the actual identifier.
Something along the lines:
#ifndef __FUNCTION_NAME__
#ifdef WIN32 //WINDOWS
#define __FUNCTION_NAME__ __FUNCTION__
#else //*NIX
#define __FUNCTION_NAME__ __func__
#endif
#endif
Problem
I am attempting to build a debug log message function that records the file, line, and function of of where the log message was called from. ``` #define DEBUG_PANIC(p) CLogging::Debuglogf( "Debug marker (%s) - ::%s() in file: %s(%d)", p, __func__ , __FILE__, __LINE__ ); ``` The above code works on some compilers but not all. My code needs to be cross compatible with GCC as well as Microsoft Visual studios. I have added the below defines to help with compatibility. ``` #ifndef __FUNCTION_NAME__ #if defined __func__ // Undeclared #define __FUNCTION_NAME__ __func__ #elif defined __FUNCTION__ // Undeclared #define __FUNCTION_NAME__ __FUNCTION__ #elif defined __PRETTY_FUNCTION__ // Undeclared #define __FUNCTION_NAME__ __PRETTY_FUNCTION__ #else // Declared #define __FUNCTION_NAME__ "N/A" #endif // __func__ #endif // __FUNCTION_NAME__ #define DEBUG_PANIC(p) CLogging::Debuglogf( "Debug marker (%s) - ::%s() in file: %s(%d)", p, __FUNCTION_NAME__, __FILE__, __LINE__ ); ``` The problem with the above code snippet is that it is the #else macro is active on all compilers while the other macros are not. in other words `#if defined __func__` is false on compilers where `__func__` is a predefined macro. My question is - How do I create a cross compiler macro to find the function name ? - How can I tell if a `__func__` can be used?