gpt4 book ai didi

c++ - 函数名 __func__ 的预定义宏

转载 作者:IT老高 更新时间:2023-10-28 21:54:49 31 4
gpt4 key购买 nike

我正在尝试构建一个调试日志消息函数,用于记录调用日志消息的文件、行和函数。

#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/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com