如何检测libstdc++;叮当作响的版本? 我想在Clang写一个“可移植”的C++库。“便携”意味着我在C预处理器中检测到编译环境中C++的哪些特性,并使用这些特性或提供我的解决方案。这与Boost库所做的类似

如何检测libstdc++;叮当作响的版本? 我想在Clang写一个“可移植”的C++库。“便携”意味着我在C预处理器中检测到编译环境中C++的哪些特性,并使用这些特性或提供我的解决方案。这与Boost库所做的类似,c++,clang,c-preprocessor,C++,Clang,C Preprocessor,但是,某些功能的存在并不取决于语言,而是取决于标准库实现。我特别感兴趣的是: 类型特征(哪些可用,拼写如何) 如果initializer\u list为constepr 我发现这有问题,因为默认情况下Clang不使用自己的标准库实现:它使用libstdc++。虽然Clang有预定义的预处理器宏\uuuu GNUC\uuuu、\uuu GNUC\u MINOR\uuuu、\uuuu GNUC\u PATCHLEVEL\uuuuu,但它们分别被硬编码为值4、2和1,并且它们很少告诉我可用的lib

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

  • 类型特征(哪些可用,拼写如何)
  • 如果
    initializer\u list
    constepr
我发现这有问题,因为默认情况下Clang不使用自己的标准库实现:它使用libstdc++。虽然Clang有预定义的预处理器宏
\uuuu GNUC\uuuu
\uuu GNUC\u MINOR\uuuu
\uuuu GNUC\u PATCHLEVEL\uuuuu
,但它们分别被硬编码为值4、2和1,并且它们很少告诉我可用的libstdc++特性


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

Clang自带了自己的标准库实现,称为。您可以通过向compile命令添加
-stdlib=libc++
来使用它

以上所述,检查CLAN/LIbSTDC++C++支持的方法有多种:

  • Clang有宏(和朋友),可用于检测语言功能和语言扩展
  • Libstdc++有自己的版本宏,请参阅。您需要包含一个libstdc++头来定义这些
  • GCC有您已经发现的版本宏,但这些宏需要手动与文档进行比较

  • 而且,我花了2分钟的时间在谷歌上搜索。

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

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    int main(int argc, const char * argv[])
    {
        cout<<"Value = "<<_LIBCPP_VERSION<<endl;
        return 0;
    }
    
    #包括
    #包括
    使用名称空间std;
    int main(int argc,const char*argv[]
    {
    
    coutso您得出的结论是,主要因素是标准库实现,但您希望检测编译器版本?您的逻辑到底是什么?
    libstdc++
    与gcc源代码一起分发,这仍然是一个不同的项目,没有任何东西能让您认为您可以确定li的版本我想有条件地编译一些代码(例如,通过预处理器指令禁用一些代码)如果我知道标准库中存在某些东西,例如libstdc++。我想用预处理器宏或其他方法来检测库中是否存在某些东西,这将有助于我检测到这些东西。如果没有这种方法,这也将是我问题的一个好答案。@Andrzej我不确定这将如何工作。如果你的标准库实现不支持某个功能或有错误代码,那么它将没有该功能或无法按你期望的方式工作。你可以在此处查找其他问题,这些问题将向你展示如何使用标准库中不存在的回退实现。我可能没有明确说明我的意图。我正在编写正在使用@remyabel:3个成员函数创建一个类:f1、f2、f3。如果我知道某个标准库功能已损坏或不存在,我只希望我的类有两个函数f1和f2。我不希望使用f3,因为它必须使用损坏的功能。@user2485710:现在我明白了你的意思。你是对的。GCC版本是个坏主意,我应该这样做我要求的是libstdc++版本。宏
    \uuuu GLIBCXX\uuuu
    -这就是我要找的。谢谢。正如链接文档中指出的那样,
    \uuuu GLIBCXX\uuuu
    不是版本号的单调函数,4.4.0的数字比4.3.6小,这使得很难使用它来检查功能。Boost正在更新其对带有clang的libstdc++版本:(它将使用_has_include检查已知已添加到每个版本库中的头)。我认为使用GLIBCXX并不是区分libstdc++特性的有用方法。例如,我需要属于C++11的trait
    std::is_琐碎地_copy_constructible
    ,但gcc在4版本中没有随编译器提供的时间最长,因此,您可以使用GCC4.9,它具有不完整的特性,并且GLIBCXX hi比gcc 5的旧版本更高,因此更小。请注意,在Linux系统上,您必须通过将
    -stdlib=libc++
    传递到
    clang++
    来链接到
    libc++