如何测试libstdc ++的版本

时间:2014-01-27 23:30:32

标签: c++ gcc c++11 libstdc++

因此,当我使用std::vector::erase调用const_iterator并且如果失败时,我深入研究了我的容器类的擦除方法。就像它对this person所做的那样。

点击gnu libstdc++ status的链接显示此问题仍未解决(原始问题是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

1 个答案:

答案 0 :(得分:3)

反正你不会和clang挂钩吗?如果它是由gcc发行版固定的,是否可以通过clang确定,反之亦然?其他编译器怎么样?

您可以获取compiler defines

的列表

例如

#define __GNUC_PATCHLEVEL__
#define __GNUC__
#define __GNUC_MINOR__ 

或clang

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

您使用autotools吗?如果是这样,那么既然你正在考虑将自己宏观化,那么你可以创建一个autotools测试来创建你自己的定义。测试不需要编译,实际上通常是测试。