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?