C++ 如何测试libstdc++;,不是GCC,在编译时?

C++ 如何测试libstdc++;,不是GCC,在编译时?,c++,gcc,clang,libstdc++,C++,Gcc,Clang,Libstdc++,我正在尝试测试libstdc++的版本,因为在4.9.0版之前随GCC发布的libstdc++版本中 请注意: 我需要测试libstdc++的版本,而不是GCC,因为Clang还支持使用libstdc++作为标准库。这就排除了 \uuuu GLIBCXX\uuuu宏是日期,而不是版本号和。例如,GCC 4.8.4附带了#define uuu GLIBCXX_uuuuuu20150426,它比GCC 4.9.0的发布日期更新 是否有任何可移植的方法来测试libstdc++的版本,而不依赖于使用

我正在尝试测试
libstdc++
的版本,因为在4.9.0版之前随GCC发布的
libstdc++
版本中

请注意:

  • 我需要测试
    libstdc++
    的版本,而不是GCC
    ,因为Clang还支持使用
    libstdc++
    作为标准库。这就排除了

  • \uuuu GLIBCXX\uuuu
    是日期,而不是版本号和。例如,GCC 4.8.4附带了
    #define uuu GLIBCXX_uuuuuu20150426
    ,它比GCC 4.9.0的发布日期更新


是否有任何可移植的方法来测试
libstdc++
的版本,而不依赖于使用GCC我的编译器?

在我看来,这个问题足够小,可以用蛮力解决

在一个名为<代码> Meal.Hpp或类似的头文件中,我将测试C++标准的版本至少是我需要的版本(<代码>然后我会添加各种宏检查,以拒绝任何我知道有缺陷的库

换句话说,我将采用黑名单方法而不是白名单方法

例如:

#pragma once
#ifndef MACHINE_HPP_HEADER_GUARDS
#define MACHINE_HPP_HEADER_GUARDS

#if __cplusplus < 201103L
// Library is incompatible if it does not implement at least the C++11
// standard.
#error "I need a library that supports at least C++11."
#else
// Load an arbitrary header to ensure that the pre-processor macro is
// defined. Otherwise you will need to load this header AFTER you
// #include the header you care about.
#include <iosfwd>
#endif

#if __GLIBCXX__ == 20150422
#error "This version of GLIBCXX (20150422) has flaws in it"
#endif

// ...repeat for other versions of GLIBCXX that you know to be flawed

#endif // MACHINE_HPP_HEADER_GUARDS
#pragma一次
#ifndef机器\u HPP\u收割台\u防护装置
#定义机器\u HPP\u收割台\u防护装置
#如果uu cplusplus<201103L
//如果库至少未实现C++11,则该库不兼容
//标准。
#错误“我需要一个至少支持C++11的库。”
#否则
//加载任意标头以确保预处理器宏
//定义。否则,您需要在完成后加载此标题
//#包括您关心的标题。
#包括
#恩迪夫
#如果uuu GLIBCXX uuuu==20150422
#错误“此版本的GLIBCXX(20150422)存在缺陷”
#恩迪夫
//…对您知道有缺陷的其他版本的GLIBCXX重复此操作
#endif//机器\水电站\收割台\防护装置

如果您知道某个版本的版本已损坏,则测试该版本是否已损坏,如果已损坏,则为损坏版本,如果未损坏,则为工作版本。实际上,确定未提供版本的版本的最佳方法是根据已知行为进行测试。我只是想澄清一下。除此之外,你正在使用什么操作系统?我正在检查windows是否可以确定版本号……奎因·罗迪:我更愿意实际测试版本。这个bug只发生在运行时,所以我必须编译(并执行)一个测试程序,作为构建过程的一部分。交叉编译时,这可能会中断。请将此作为主编译的依赖项进行尝试,测试您知道在不符合标准的版本中中断的行为。如果中断,请使依赖项退出1,可能会有投诉。我正在尝试找出如何解决此问题“添加各种宏检查以拒绝任何我知道有缺陷的库。”我不知道如何在使用非GCC编译器(例如Clang)构建时可靠地检查
libstdc++
的版本。感谢您扩展您的答案。但是,这不是一个非常易于维护的解决方案。
\uuuu GLIBCXX\uuuu
不会单调增加,因此每次发布新版本的GCC>4.9时,我都必须编辑此标题。@Michaelkova事实并非如此。这正是您只标记不想使用的编译器的原因。当新版本的GCC发布了,您只需使用它,而不需要对标题进行任何修改。GCC 4.8的所有版本中都存在此缺陷。如果发布了新版本的GCC 4.8,则构建将被破坏,直到我将
\uu GLIBCXX\uuuuu
的相应值列入黑名单。不幸的是,这不仅仅是一个理论问题:两个版本(4.8.4和4.8.5)仅在过去六个月内发布。