Predefiniowane makra dla nazwy funkcji __func__
Próbuję zbudować funkcję komunikatu dziennika debugowania, która rejestruje plik, linię i funkcję, z której został wywołany komunikat dziennika.
#define DEBUG_PANIC(p) CLogging::Debuglogf( "Debug marker (%s) - ::%s() in file: %s(%d)", p, __func__ , __FILE__, __LINE__ );
Powyższy kod działa na niektórych kompilatorach, ale nie na wszystkich. Mój kod musi być kompatybilny krzyżowo z GCC i Microsoft Visual Studio. Dodałem poniższe definicje, aby pomóc w kompatybilności.
#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__ );
Problem z powyższym fragmentem kodu polega na tym, że makro #else jest aktywne na wszystkich kompilatorach, podczas gdy inne makra nie. innymi słowy#if defined __func__
jest fałszywe na kompilatorach gdzie__func__
jestpredefiniowane makro.
Moje pytanie brzmi
Jak utworzyć makro kompilatora krzyżowego, aby znaleźć nazwę funkcji?Jak mogę stwierdzić, czy a__func__
może być użyty?