作者热门文章
- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我正在尝试构建一个调试日志消息函数,用于记录调用日志消息的文件、行和函数。
#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__
是 预定义宏 的编译器上为 false。
我的问题是
__func__
是否可以使用? 最佳答案
您假设 __func__
是一个宏,但事实并非如此。这是一个有条件支持的预定义标识符,因此您无法使用 #if defined
或 #ifdef
进行检查。
如果编译器无法告诉您这是否受支持(他们可以通过 _FUNC_SUPPORTED
或其他方式,我并不是说他们实际上正在这样做),您必须检查编译器而不是实际的标识符。
类似的东西:
#ifndef __FUNCTION_NAME__
#ifdef WIN32 //WINDOWS
#define __FUNCTION_NAME__ __FUNCTION__
#else //*NIX
#define __FUNCTION_NAME__ __func__
#endif
#endif
关于c++ - 函数名 __func__ 的预定义宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15305310/
我是一名优秀的程序员,十分优秀!