我正在尝试构建一个调试日志消息函数,该函数记录调用日志消息的文件、行和函数。
#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__
的。
我的问题是
- 如何创建交叉编译器宏来查找函数名称?
- 如何判断 a 是否
__func__
可以使用?