如何在编译时测试libstdC++的版本,而不是GCC?
我试图测试libstdc++
的版本,因为版本中的std::regex
is implemented, but largely broken,在版本4.9.0之前随GCC发布。如何在编译时测试libstdC++的版本,而不是GCC?
需要注意的是:
我需要测试的
libstdc++
的版本,而不是GCC因为锵还支持使用libstdc++
作为标准库。这排除了testing the__GNUC_PATCHLEVEL__
,__GNUC__
, and__GNUC_MINOR__
macros。的
__GLIBCXX__
宏是一个日期,而不是一个版本号和does not increase monotonically。例如,GCC 4.8.4附带#define __GLIBCXX__ 20150426
,这比GCC 4.9.0的发布日期更新。
是否有测试libstdc++
不依赖于使用GCC编译我的版本的任何可移植的方法?
在我看来,这个问题足够小,可以通过暴力解决。
在一个名为machine.hpp
或类似的头文件中,我会测试C++标准的版本至少是我需要的(__cplusplus
宏)。然后,我会添加各种宏检查来拒绝任何我知道存在缺陷的库。
换句话说,我会拿黑名单的办法,而不是白名单的做法。
例如:
#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
我想知道如何“添加各种宏检查以拒绝任何库我知道这是有缺陷的。“在使用非GCC编译器(例如Clang)构建时,我无法弄清楚如何可靠地检查'libstdC++'的版本。 –
感谢您扩大您的答案。但是,这不是一个可维护的解决方案。 '__GLIBCXX__'不会单调递增,因此每次发布GCC> 4.9的新版本时都必须编辑此头文件。 –
@MichaelKoval不是这种情况。正因如此,您只需标记您不想使用的编译器。当新版本的GCC出来时,您只需使用它,而不需要对标题进行任何修改。 – Escualo
如果你知道它在某个版本的破碎,然后对其进行测试,看看它坏了,如果是,那么你有破碎的版本,如果没有,那么你有工作版本。 – ydobonebi
在实践中,确定没有给出版本的版本的最佳方法是测试已知行为。只是想澄清一点。除此之外,你在使用什么操作系统?我正在检查窗口,如果我可以确定我的ersion数字或不... – ydobonebi
Quinn Roundy:我宁愿实际测试版本。该错误只发生在运行时,所以我将不得不编译(并执行)测试程序作为我的构建过程的一部分。在交叉编译时,这可能会中断。 –