【问题标题】:How can I check via macro whether the GNU libstdc++ is used?如何通过宏检查是否使用了 GNU libstdc++?
【发布时间】:2014-09-17 13:24:02
【问题描述】:

如何通过宏检查是否使用了 (GNU GCC) libstdc++ STL 实现?那可能吗?我希望在 GCC 和 Clang 中都能使用它。

对于 Linux 上的 C++11,它可能是唯一的选择(或者是吗?)。 (STLport 不支持 C++11,AFAIK。)在 MacOSX 上,(LLVM)libc++ STL 更有可能,如果您使用 Clang(可能也用于 GCC,不确定)。

【问题讨论】:

  • 在包含一些标题后尝试#ifdef __GLIBCXX__
  • 为什么?如果你使用的是 C++ 标准库的功能,它应该是标准的,而不是依赖于实现的。

标签: c++ stl


【解决方案1】:

在包含 C++ 标准包含文件之一后,您可以检查 __GLIBCXX__(或 __GLIBCPP__,对于 3.4.0 之前的版本)宏是否存在(cstddef 是一个不错的选择):

#include <cstddef>
#if defined(__GLIBCXX__) || defined(__GLIBCPP__)
  /* Using GNU GCC libstdc++, so using also its STL implementation */ 
#endif

在这里阅读更多:

【讨论】:

  • 但我想我需要先从 STL 定义 something ?还是编译器设置了这个宏?什么是一个很好的小包括来获得那个宏?
  • @Albert 是的,您需要在检查宏之前包含一些库头文件。 __GLIBCXX__ 宏是在您 #include &lt;bits/c++config.h&gt; 时定义的,但它依赖于实现,因此在不同的实现下可能会出现语法错误。按大小订购不同的 C++ 库包含文件,并排除仅在较新的 C++ 版本中可用的文件,我会选择#include &lt;string&gt;。 (更新答案以反映这一点)
  • @Albert 更好的是:#include &lt;cstddef&gt;。 (更新答案以反映这一点)
  • 我认为说“所以也使用它的 STL 实现”几乎没有意义。 OP 想要查看正在使用哪个 C++ 标准库实现,因此简单地说“使用 GNU GCC libstdc++”就可以了。引用“STL 实现”是没有帮助的,因为它意味着您正在谈论与标准库分开的东西,好像使用 GCC + libstdc++ + SGI STL 或其他一些组合是现实的。当您指的是标准库时,说的是标准库,而不是“STL”。
  • @JonathanWakely 我完全同意你的看法。无论如何,我把关于 STL 的评论放在那里,因为 OP 在他的问题中反复提到 STL 并用#stl 标记它。
猜你喜欢
  • 2014-03-19
  • 1970-01-01
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 2015-02-10
  • 1970-01-01
  • 1970-01-01
  • 2016-08-25
相关资源
最近更新 更多