gpt4 book ai didi

用于测试 __func__、__FUNCTION__、__PRETTY_FUNCTION__ 等可用性的 C++ 宏

转载 作者:太空狗 更新时间:2023-10-29 21:34:06 26 4
gpt4 key购买 nike

各种现代 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试图映射到编译器提供的合适的“当前函数”功能的宏。

文档在这里:

http://www.boost.org/doc/libs/1_66_0/libs/assert/doc/html/assert.html#current_function_macro_boost_current_function_hpp

下面是宏的简明再现以供引用:

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

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