Macros predefinidas para el nombre de la función __func__

Estoy intentando construir una función de mensaje de registro de depuración que registre el archivo, la línea y la función de donde se llamó el mensaje de registro.

#define DEBUG_PANIC(p) CLogging::Debuglogf( "Debug marker (%s) - ::%s() in file: %s(%d)", p, __func__ , __FILE__, __LINE__ );

El código anterior funciona en algunos compiladores, pero no en todos. Mi código debe ser compatible con GCC y con Microsoft Visual studios. He añadido las siguientes definiciones para ayudar con la compatibilidad.

#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__ );

El problema con el fragmento de código anterior es que la macro #else está activa en todos los compiladores, mientras que las otras macros no lo están. en otras palabras#if defined __func__ es falso en los compiladores donde__func__ es unmacro predefinida.

Mi pregunta es

¿Cómo creo una macro de compilador cruzado para encontrar el nombre de la función?¿Cómo puedo saber si un__func__ ¿puede ser usado?

Respuestas a la pregunta(4)

Su respuesta a la pregunta