Я пытаюсь создать функцию сообщения журнала отладки, которая записывает файл, строку и функцию того, откуда вызывается сообщение журнала.
#define DEBUG_PANIC(p) CLogging::Debuglogf( "Debug marker (%s) - ::%s() in file: %s(%d)", p, __func__ , __FILE__, __LINE__ );
Вышеприведенный код работает с некоторыми компиляторами, но не со всеми. Мой код должен быть совместим с GCC, а также с Microsoft Visual studio. Я добавил следующие определения, чтобы помочь с совместимостью.
#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__ );
Проблема с приведенным выше фрагментом кода заключается в том, что макроС#else активен для всех компиляторов, а другие макросы - нет. другими словами #if defined __func__
является ложным в компиляторах, где __func__
- предопределенный макрос.
Мой вопрос
- Как создать макрос кросс-компилятора для поиска имени функции?
- Как узнать, можно ли использовать
__func__
?