2014-01-27 5 views
2

Итак, я был глубоко в глубине своего кода, написав метод стирания для своего класса контейнеров, когда я пошел звонить по телефону std::vector::erase с const_iterator и, если он сильно не удался. Как и для this person.Как проверить версию libstdC++

По ссылкам на 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 
+0

[libstdC++ website] (http://gcc.gnu.org/libstdc++/) говорит: «* libstdC++ - v3 разработан и выпущен как часть GCC, отдельные снимки больше не доступны. *". Поэтому проверка версий GCC - это, вероятно, то, что вы должны делать. – Praetorian

+0

Я, который все еще оставляет меня на крючке, если я собираюсь с 'clang'. – woolstar

ответ

3

Вы не быть на крючок с лязгом так или иначе? Если это зафиксировано дистрибутивом gcc, то гарантируется ли оно фиксированным clang и наоборот? Как насчет других компиляторов?

Вы можете получить список compiler defines

Например

#define __GNUC_PATCHLEVEL__ 
#define __GNUC__ 
#define __GNUC_MINOR__ 

или для лязга

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

вы используете autotools Do? Если это так, то, так как вы все равно думаете о том, чтобы самостоятельно вывести себя из этой ситуации, вы можете создать тест autotools для создания своего собственного определения. Тест не нужно компилировать, на самом деле, как правило, это тест.

Смежные вопросы