是否有一种干净的方法来禁用 C++ 功能宏?
Is there a clean way to disable a C++ feature macro?
我们有一个引入第 3 方的模块,特别是 sqlite_modern_cpp
尽管我认为这不是特别重要。重要的是代码使用 C++ 功能宏和(特别是)测试 __cpp_lib_uncaught_exceptions
以了解是否定义了 std::uncaught_exceptions
。
到目前为止一切顺利,只是我们现在正在寻求将我们的 C++ 标准从 C++14 更改为 C++17。在 iOS 构建(不完全了解其他目标)上,这是突然定义的。但是,我们将 iOS 的最低版本定位为 9.3,因此,编译器 returns 错误地说 iOS 所需的最小值是 10.0.
如果可能的话,我宁愿不要触及第三方代码,所以我对此的理想解决方案是告诉编译器不要定义 __cpp_lib_uncaught_exceptions
,这样它就会回到以前的解决方案.有干净的方法吗?
功能测试宏只是普通宏,您可以 #undef
。 include <exception>
首先定义宏,然后是 undef,然后是库。 sqlite_modern_cpp
是一个仅 header 的库,所以这应该不会造成问题。
#include <exception>
#undef __cpp_lib_uncaught_exceptions
#include "sqlite_modern_cpp.h"
这将由 availability mechanic in libcxx. For example, __cpp_lib_shared_mutex
is controlled by the preprocessor symbol _LIBCPP_AVAILABILITY_DISABLE_FTM___cpp_lib_shared_mutex
, which is defined 根据各种 Apple 操作系统声明的最低目标版本来处理。
复制此机制以类似地定义一个 _LIBCPP_AVAILABILITY_DISABLE_FTM___cpp_lib_uncaught_exceptions
来禁用 __cpp_lib_uncaught_exceptions
应该相当容易;您需要修补 headers <version>
和 <__availability>
。您可能想要更新 Clang issue 39631,它于 2018 年关闭(我认为不正确,但当时可能不存在可用性机制)。
我们有一个引入第 3 方的模块,特别是 sqlite_modern_cpp
尽管我认为这不是特别重要。重要的是代码使用 C++ 功能宏和(特别是)测试 __cpp_lib_uncaught_exceptions
以了解是否定义了 std::uncaught_exceptions
。
到目前为止一切顺利,只是我们现在正在寻求将我们的 C++ 标准从 C++14 更改为 C++17。在 iOS 构建(不完全了解其他目标)上,这是突然定义的。但是,我们将 iOS 的最低版本定位为 9.3,因此,编译器 returns 错误地说 iOS 所需的最小值是 10.0.
如果可能的话,我宁愿不要触及第三方代码,所以我对此的理想解决方案是告诉编译器不要定义 __cpp_lib_uncaught_exceptions
,这样它就会回到以前的解决方案.有干净的方法吗?
功能测试宏只是普通宏,您可以 #undef
。 include <exception>
首先定义宏,然后是 undef,然后是库。 sqlite_modern_cpp
是一个仅 header 的库,所以这应该不会造成问题。
#include <exception>
#undef __cpp_lib_uncaught_exceptions
#include "sqlite_modern_cpp.h"
这将由 availability mechanic in libcxx. For example, __cpp_lib_shared_mutex
is controlled by the preprocessor symbol _LIBCPP_AVAILABILITY_DISABLE_FTM___cpp_lib_shared_mutex
, which is defined 根据各种 Apple 操作系统声明的最低目标版本来处理。
复制此机制以类似地定义一个 _LIBCPP_AVAILABILITY_DISABLE_FTM___cpp_lib_uncaught_exceptions
来禁用 __cpp_lib_uncaught_exceptions
应该相当容易;您需要修补 headers <version>
和 <__availability>
。您可能想要更新 Clang issue 39631,它于 2018 年关闭(我认为不正确,但当时可能不存在可用性机制)。