2008-11-03 1 views
27

Я хотел бы включить другой файл в зависимости от версии GCC. Точнее я хочу написать:Как проверить во время компиляции текущую версию GCC?

#if GCC_VERSION >= 4.2 
# include <unordered_map> 
# define EXT std 
#elif GCC_VERSION >= 4 
# include <tr1/unordered_map> 
# define EXT std 
#else 
# include <ext/hash_map> 
# define unordered_map __gnu_cxx::hash_map 
# define EXT __gnu_cxx 
#endif 

Мне все равно, gcc до 3.2.

Примечание: Я уверен, что для этого требуется переменная, определенная для предварительной обработки, я просто не могу ее найти.

ответ

26

Хорошо, после дополнительных поисков, один из возможных способов сделать это - использовать __GNUC_PREREQ, определенный в features.h.

#ifdef __GNUC__ 
# include <features.h> 
# if __GNUC_PREREQ(4,0) 
//  If gcc_version >= 4.0 
# elif __GNUC_PREREQ(3,2) 
//  If gcc_version >= 3.2 
# else 
//  Else 
# endif 
#else 
// If not gcc 
#endif 
+2

К сожалению, этот код не с clang, который определяет `__GNUC__`, но не включает` features.h`. – Gil 2013-05-22 13:19:51

+0

Ну, этот код должен знать версию GCC, поэтому неудивительно, что это не удается, если clang частично олицетворяет GCC. – PierreBdR 2013-05-28 11:44:28

41

Есть целый ряд макросов, которые должны быть определены для ваших нужд:

__GNUC__    // major 
__GNUC_MINOR__  // minor 
__GNUC_PATCHLEVEL__ // patch 

Формат версии major.minor.patch, например, 4.0.2

Документация по ним может быть найдена here.

16

В качестве примечания:

Чтобы найти все предопределенные макросы:

  • Создать пустой файл t.cpp
  • g++ -E -dM t.cpp