如何在编译时测试libstdC++的版本,而不是GCC?

问题描述:

我试图测试libstdc++的版本,因为版本中的std::regex is implemented, but largely broken,在版本4.9.0之前随GCC发布。如何在编译时测试libstdC++的版本,而不是GCC?

需要注意的是:

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

+0

如果你知道它在某个版本的破碎,然后对其进行测试,看看它坏了,如果是,那么你有破碎的版本,如果没有,那么你有工作版本。 – ydobonebi

+1

在实践中,确定没有给出版本的版本的最佳方法是测试已知行为。只是想澄清一点。除此之外,你在使用什么操作系统?我正在检查窗口,如果我可以确定我的ersion数字或不... – ydobonebi

+1

Quinn Roundy:我宁愿实际测试版本。该错误只发生在运行时,所以我将不得不编译(并执行)测试程序作为我的构建过程的一部分。在交叉编译时,这可能会中断。 –

在我看来,这个问题足够小,可以通过暴力解决。

在一个名为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 
+0

我想知道如何“添加各种宏检查以拒绝任何库我知道这是有缺陷的。“在使用非GCC编译器(例如Clang)构建时,我无法弄清楚如何可靠地检查'libstdC++'的版本。 –

+0

感谢您扩大您的答案。但是,这不是一个可维护的解决方案。 '__GLIBCXX__'不会单调递增,因此每次发布GCC> 4.9的新版本时都必须编辑此头文件。 –

+0

@MichaelKoval不是这种情况。正因如此,您只需标记您不想使用的编译器。当新版本的GCC出来时,您只需使用它,而不需要对标题进行任何修改。 – Escualo