如何测试libstdc++的版本

How do I test for a version of the libstdc++

本文关键字:libstdc++ 版本 测试 何测试      更新时间:2023-10-16

因此,当我用const_iterator调用std::vector::erase时,我正在为容器类编写一个擦除方法,如果失败得很厉害。就像这个人一样。

下面的gnu-libstdc++状态链接表明,这个问题仍然没有得到解决(最初的问题是在2013年初)。

所以我编了一个可怕的破解:

#if 1
// horrible hack for gnu libstd++ deficit 
// current implementation does not allow erase(const_iterator), so recreate plain iterator 
off_t::iterator itx= offsets_.begin() + ( apos.iter() - offsets_.begin() ) ;
#else
// for compliant implementations 
auto itx= apos.iter() ;
#endif

但我想知道是否有#define我可以使用与libstdc++版本相关的。编译器的版本有很多需要测试的地方,但我不认为gcc版本会是修复这一问题的好指标,而且由于clang默认情况下使用相同的库,我需要以任何一种方式捕捉它。我看了一下g++ -E -dM - < /dev/null的输出,但唯一提到STD的似乎并不乐观:

#define __STDC_HOSTED__ 1
#define __STDC_IEC_559__ 1
#define __STDC_ISO_10646__ 201103L
#define __STDC_NO_THREADS__ 1
#define _STDC_PREDEF_H 1
#define __STDC_IEC_559_COMPLEX__ 1
#define __STDC__ 1

无论如何,你不会被clang所困扰吗?如果它是由gcc发行版固定的,它是否保证由clang固定,反之亦然?其他编译器呢?

您可以获得编译器定义的列表

例如

#define __GNUC_PATCHLEVEL__
#define __GNUC__
#define __GNUC_MINOR__ 

或用于叮当声

#define __clang__ 
#define __clang_major__ 
#define __clang_minor__ 
#define __clang_patchlevel__ 

你使用自动工具吗?如果是这样的话,那么既然你无论如何都在考虑从宏中摆脱这种情况,你可以创建一个自动工具测试来创建你自己的定义。测试不需要编译,事实上这通常就是测试。