我正在尝试测试libstdc++
的版本,因为在版本4.9.0之前与GCC一起分发的libstdc++
版本中std::regex
is implemented, but largely broken,。
请注意:
我需要测试 libstdc++
的版本,而不是GCC ,因为Clang还支持使用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的发布日期更新。
是否有任何可移植的方法来测试不依赖于使用GCC编译器的libstdc++
版本?
答案 0 :(得分:-2)
在我看来,这个问题足够小,无法用蛮力来解决。
在名为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