Как проверить версию libstdС++

Итак, я был глубоко погружен в свой код, написав метод стирания для моего класса контейнера, когда я пошел на вызов std::vector::erase с const_iterator и, если потерпел неудачу, сильно. Как и для этого человека.

Переход по ссылкам на статус 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

person woolstar    schedule 27.01.2014    source источник
comment
На веб-сайте libstdc++ говорится, что libstdc++-v3 разработана и выпущена как часть GCC, отдельные снимки больше не доступны.. Так что проверка версий GCC, вероятно, то, что вам следует делать.   -  person Praetorian    schedule 28.01.2014
comment
Да, это все еще оставляет меня на крючке, если я компилирую с clang.   -  person woolstar    schedule 28.01.2014


Ответы (1)


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

Вы можете получить список определений компилятора

Например

#define __GNUC_PATCHLEVEL__
#define __GNUC__
#define __GNUC_MINOR__ 

или для лязга

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

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

person waTeim    schedule 28.01.2014