- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
各种现代 C/C++ 编译器包含一个或两个 __func__
/__FUNCTION__
用于记录当前执行的函数。 MSVC++ 还包括 __FUNCSIG__
和 GCC __PRETTY_FUNCTION__
作为此功能的特定于编译器的增强版本。
但是,GCC 将它们定义为变量 而不是宏,因此无法通过 #ifdef
预处理器指令来测试它们的存在。
我正在使用一个代码库,该代码库必须与 C++98 和 C++11 风格的 MSVC++ 和 GCC 一起工作,并且有人错误地编写的日志记录工具试图测试 __FUNCTION__
如果__FUNCSIG__
不可用。此检查始终返回 false,渲染函数日志记录支持不可操作。
问题:是否有一个好的宏可以让我的用例充分猜测这些功能中的哪些(如果有的话)应该存在,可能是通过嗅探编译器版本?
最佳答案
T.C.首先提供这个答案,作为我问题下的评论,我最终将我的解决方案基于它:
header <boost/current_function.hpp>
在 Boost.Assert 中实现了一个 BOOST_CURRENT_FUNCTION
试图映射到编译器提供的合适的“当前函数”功能的宏。
文档在这里:
下面是宏的简明再现以供引用:
#if defined( BOOST_DISABLE_CURRENT_FUNCTION )
# define BOOST_CURRENT_FUNCTION "(unknown)"
#elif defined(__GNUC__) || (defined(__MWERKS__) && (__MWERKS__ >= 0x3000)) || (defined(__ICC) && (__ICC >= 600)) || defined(__ghs__)
# define BOOST_CURRENT_FUNCTION __PRETTY_FUNCTION__
#elif defined(__DMC__) && (__DMC__ >= 0x810)
# define BOOST_CURRENT_FUNCTION __PRETTY_FUNCTION__
#elif defined(__FUNCSIG__)
# define BOOST_CURRENT_FUNCTION __FUNCSIG__
#elif (defined(__INTEL_COMPILER) && (__INTEL_COMPILER >= 600)) || (defined(__IBMCPP__) && (__IBMCPP__ >= 500))
# define BOOST_CURRENT_FUNCTION __FUNCTION__
#elif defined(__BORLANDC__) && (__BORLANDC__ >= 0x550)
# define BOOST_CURRENT_FUNCTION __FUNC__
#elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901)
# define BOOST_CURRENT_FUNCTION __func__
#elif defined(__cplusplus) && (__cplusplus >= 201103)
# define BOOST_CURRENT_FUNCTION __func__
#else
# define BOOST_CURRENT_FUNCTION "(unknown)"
#endif
我最终修改了我正在使用的代码库,以便在可用时使用 Boost 宏,否则回退到合理的 Boost 检查子集(GCC > MSVC++ > C++11)。
关于用于测试 __func__、__FUNCTION__、__PRETTY_FUNCTION__ 等可用性的 C++ 宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48213572/
我看到 __PRETTY_FUNCTION__ 在本站的问题解答中用了很多,我明白这个函数的用处,但为什么叫 __PRETTY_FUNCTION__ 呢?这不是一个丑陋的功能,但也不是很漂亮。 最佳答
我已将此代码用作我的应用程序的 UncaughtExceptionHandler 以捕获一些崩溃信息并将其返回给我: NSArray *callStack = [exception callStack
我在 NetBeans 中有基本的 cpp 文件。当我想使用 "__PRETTY_FUNCTION__" 时,我收到此消息“无法解析标识符 __PRETTY_FUNCTION__”。我该如何解决或者为
请引用这段代码: #include #include constexpr std::size_t strlen(char const* s) { std::size_t n = 0;
在向日志文件报告消息(错误、警告等)时,我目前正在使用 __PRETTY_FUNCTION__。这确保不会混淆哪个函数创建了错误消息。 目前,我想自动从日志文件中获取输出并将其与最初创建它的代码链接起
...../PluginLoader.h:34:“Dummy_Func_For_Generating_FUNCTION_NAME_Macro()”的多重定义 上面的错误是下面代码的输出。我的文件中包含
有没有办法让 __PRETTY_FUNCTION__ 宏只解析为 ObjC 选择器的第一部分? -(void)arg1:(int)a1 arg2:(int)a2 arg3:(int)a3 {
如果我的函数是: void foo(bool bar) { qDebug() << __PRETTY_FUNCTION__; } foo(getBool()); 将输出 "void foo(b
在 Visual Studio 2017(确切地说是 15.5.6)中使用 Visual C++ 时,我注意到 GCC 中的 __PRETTY_FUNCTION__ 似乎可以工作! - 至少在某种程度
我使用 g++ 4.8.1 并使用这两个宏进行调试。但是,__func__ 宏只给我函数名,如果您在不同的类中有许多同名函数,这可能会产生误导。 __PRETTY_FUNCTION__ 宏生成整个函数
我有一个使用宏来跟踪消息的日志库。此宏使用 __func__ 和 __PRETTY_FUNCTION__ 等预定义宏来指示消息记录在哪个函数/方法中。 我的日志库的宏定义在我的日志库的主 header
__PRETTY_FUNCTION__、__FUNCTION__、__func__ 之间有什么区别,它们在哪里记录?我如何决定使用哪一个? 最佳答案 __func__ 是一个隐式声明的标识符,当它在函
我在我的代码中使用了 __FUNCTION__、__PRETTY_FUNCTION__ 宏,我了解到代码需要在 GCC 以外的编译器下编译。这些宏是标准的一部分吗?或 GCC 扩展?我应该改用 __f
我试图在编译时将 __PRETTY_FUNCTION__ 附加到 c 字符串前缀。但它无法编译。而如果我用 __FILE__ 来做,它就不会失败。 const char* s1= "Prefix" _
我正在考虑 this solution减少 __PRETTY_FUNCTION__ 的输出。该解决方案删除了返回类型、参数和修饰符。 我想知道以下修改是否适用于任何情况: inline std::
就像 @interface MyClass : NSObject @end @implementation MyClass + (void)helloWorld { printf("Hello
各种现代 C/C++ 编译器包含一个或两个 __func__/__FUNCTION__ 用于记录当前执行的函数。 MSVC++ 还包括 __FUNCSIG__ 和 GCC __PRETTY_FUNCT
我有这段代码,如果你注释掉注释“但这不起作用?!”的行,它编译得很好,但如果你不这样做,编译器会产生错误。 至少,gcc 8.2 generates an error . 但是,他们看起来和我一模一样
我刚刚注意到 __func__、__FUNCTION__ 和 __PRETTY_FUNCTION__ 不被视为预处理器宏,并且在16.8 预定义宏名称 标准 (N4527 Working Draft)
在 Objective C 中,您可以记录正在调用的方法: NSLog(@"%s", __PRETTY_FUNCTION__) 通常这是从日志记录宏中使用的。 尽管 Swift 不支持宏(我认为),但
我是一名优秀的程序员,十分优秀!