如何在Clang中检测libstdc ++版本?

时间:2014-02-07 08:16:22

标签: c++ clang c-preprocessor

我想在Clang中编写一个“可移植”的C ++库。 “可移植”意味着我检测(在C预处理器中)编译环境中可用的C ++功能,并使用这些功能或提供我的解决方法。这类似于Boost库正在做的事情。

但是,某些功能的存在不取决于语言,而是取决于标准库实现。我特别感兴趣的是:

  • 类型特征(其中哪些是可用的并且具有什么拼写)
  • 如果initializer_listconstexpr

我发现这有问题,因为默认情况下Clang不使用自己的标准库实现:它使用libstdc ++。虽然Clang预定义了预处理器宏__GNUC____GNUC_MINOR____GNUC_PATCHLEVEL__,但它们分别硬编码为值4,2,1,并且它们对可用的libstdc ++功能几乎没有说明。

如何在Clang预处理器中检查它正在使用的libstdc ++版本?

2 个答案:

答案 0 :(得分:1)

Clang确实带有自己的标准库实现,它被称为libc++。您可以通过将-stdlib=libc++添加到编译命令来使用它。

话虽如此,有多种方法可以检查Clang / libstdc ++ C ++支持:

  1. Clang拥有__has_feature宏(以及朋友),可用于检测语言功能和语言扩展。
  2. Libstdc ++有自己的版本宏,请参阅the documentation。您需要包含一个libstdc ++标头才能获得这些定义。
  3. GCC拥有您已发现的版本宏,但需要手动将其与文档进行比较。
  4. 而且,这花了我2分钟的谷歌搜索。

答案 1 :(得分:0)

我认为这会有所帮助。它输出_LIBCPP_VERSION宏的值:

#include <iostream>
#include <string>

using namespace std;

int main(int argc, const char * argv[])
{
    cout<<"Value = "<<_LIBCPP_VERSION<<endl;
    return 0;
}

再次编译所需信息的clang版本。