gpt4 book ai didi

xcode - 检测 clang 是使用 c++11 还是遗留的 libstdc++ 标准库进行编译

转载 作者:行者123 更新时间:2023-12-04 17:49:03 24 4
gpt4 key购买 nike

我有一个 Xcode 项目,我要迁移它以与 clang 的选项一起使用 -stdlib libc++ , 启用 C++11 支持。我的一些源文件需要知道正在使用哪个库,例如,以便我执行以下操作:

#ifdef HAVE_CPP11_LIB_SUPPORT
#include <memory>
#else
#include <tr1/memory>
#endif

#ifdef HAVE_CPP11_LIB_SUPPORT
vector.emplace_back(newValue);
#else
vector.push_back(newValue);
#endif

我在查找为此选项设置的预处理器宏(如果确实有的话)时遇到了麻烦。我试过用以下方法转储 clang 的输出:
clang -x c++ -std=c++11 -stdlib=libc++ -dM -E - < /dev/null

比较:
clang -x c++ -std=c++11 -stdlib=libstdc++ -dM -E - < /dev/null

但这给出了相同的结果。请注意,我不想切换是否使用 c++11 语言设置,而是切换是否使用 c++11 库。有没有可靠的方法可以在代码中检测到这一点?

最佳答案

我不知道有什么方法可以保证便携,但这是我现在使用的方法:

// libc++ detected:     _LIBCPP_VERSION
// libstdc++ detected: __GLIBCXX__
#if defined(__clang__)
# if __has_include(<__config>) // defines _LIBCPP_VERSION
# include <__config>
# elif __has_include(<bits/c++config.h>) // defines __GLIBCXX__
# include <bits/c++config.h>
# else
# include <ios>
# endif
#elif defined(__GNUC__) // gcc does not have __has_include
# include <ios> // ios should include the c++config.h which defines __GLIBCXX__
#endif

这不是很好,但现在对我有用。

libc++ 定义 _LIBCPP_VERSION和 stdc++ 定义了 __GLIBCXX__这很好,但不幸的是这些宏不是由编译器定义的。相反,它们是在非标准头文件中定义的,除非已包含该头文件,否则您无法测试它们的定义。

注意:显然 stdc++ 定义了 __GLIBCPP__在旧版本中。由于您需要 c++11,因此这不会成为问题。

Clang(编辑:C++17 以来的标准)有一个不错的特性 __has_include可以用来测试这些,但如果没有找到头,宏回退到只包含一个标准头,希望使用引擎盖下的内部头。我有 <ios>在这里,但要包含的标准标题的选择取决于您。您可以查找包含内部 header 的 header ,例如(这是针对 linux 上的 gcc):
grep -Rl '#include <bits/c++config.h>' /usr/include/c++

选择您可能在项目中使用的任何标题。

由于这不能保证适用于任何给定的过去或 future 的编译器/标准库版本,因此除了可选功能外,我不会依赖这些定义来实现任何功能,例如:
#ifdef __GLIBCXX__
std::set_terminate(__gnu_cxx::__verbose_terminate_handler);
#endif

关于xcode - 检测 clang 是使用 c++11 还是遗留的 libstdc++ 标准库进行编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22531247/

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