2009-12-20 6 views
18

Я столкнулся с ошибкой с gcc v3.4.4 и который помещает #ifdef в свой код, чтобы обойти ошибку только для этой версии компилятора.Каковы предопределенные макросы gcc для номера версии компилятора?

Какие предопределенные макросы компилятора GCC предопределены для определения номера версии компилятора?

+1

Возможный дубликат [Как проверить текущую версию GCC?] (Http://stackoverflow.com/questions/259248/how-do-i-test-the-current-version-of-gcc), как общие C/C++ –

ответ

26

От ГНУ CPP руководства ...


__GNUC__ 
__GNUC_MINOR__ 
__GNUC_PATCHLEVEL__ 

Эти макросы определены всеми компиляторами GNU, которые используют C препроцессор: C, C++, Objective-C и Fortran. Их значениями являются основная версия, младшая версия и уровень исправления компилятора, как целочисленные константы. Например, GCC 3.2.1 определит __GNUC__ на 3, __GNUC_MINOR__ на 2 и __GNUC_PATCHLEVEL__ на 1. Эти макросы также определены, если вы вызываете препроцессор напрямую.

__GNUC_PATCHLEVEL__ является новичком в GCC 3.0; он также присутствует в широко используемых моментальных снимках разработки, ведущих до 3.0 (которые идентифицируют себя как GCC 2.96 или 2.97, в зависимости от того, какой снимок у вас есть).

Если вам нужно знать, является ли ваша программа скомпилирована GCC или компилятором не GCC, который утверждает, что принимает диалекты GNU C, вы можете просто проверить __GNUC__. Если вам нужно написать код, который зависит от конкретной версии, вы должны быть более осторожны.Каждый раз, когда младшая версия увеличивается, уровень исправления сбрасывается до нуля; каждый раз, когда основная версия увеличивается (что случается редко), второстепенная версия и уровень исправления сбрасываются. Если вы хотите использовать предопределенные макросы непосредственно в условном, вам нужно будет написать так:

  /* Test for GCC > 3.2.0 */ 
      #if __GNUC__ > 3 || \ 
       (__GNUC__ == 3 && (__GNUC_MINOR__ > 2 || \ 
           (__GNUC_MINOR__ == 2 && \ 
            __GNUC_PATCHLEVEL__ > 0)) 
+1

Отсутствует правый парн в конце макроса препроцессора? – user318904

+0

Это я, или у clang есть тот же \ _ \ _ GNUC \ _ \ _, определенный? Итак, не настоящий тест для gcc? – Bram

15

__GNUC__, __GNUC_MINOR__ и __GNUC_PATCHLEVEL__.

Например, GCC 4.0.1 будет делать:

#define __GNUC__ 4 
#define __GNUC_MINOR__ 0 
#define __GNUC_PATCHLEVEL__ 1 

Вот небольшая командная строка, приятно вспомнить, когда вы задаетесь вопросом, которые в предопределенных определены директивы препроцессора, определяемого с помощью компилятора GNU GCC под вашим текущая среда программирования:

НКУ -E -dM - </DEV/нуль | менее

+4

Приятный трюк в предопределенных препроцессорах GCC. При сортировке еще лучше: 'gcc -E -dM - Bart

+0

Спасибо за ваш совет - работает '' gcc -E -dM - Phil

1

с:

__GNUC__
__GNUC_MINOR__
__GNUC_PATCHLEVEL__
Эти макросы определены все компиляторы GNU, которые используют C препроцессор: C, C++, Objective-C и Fortran. Их значениями являются основная версия, младшая версия и уровень исправления компилятора, как целочисленные константы. Например, GCC 3.2.1 определит __GNUC__ до 3, __GNUC_MINOR__ до 2 и __GNUC_PATCHLEVEL__ до 1. Эти макросы также определены, если вы вызываете препроцессор напрямую.

и

__VERSION__
Этот макрос раскрывается в строку постоянной, которая описывает версию компилятора в использовании. Вы не должны полагаться на его содержимое, имеющее какую-либо конкретную форму, но на него можно рассчитывать, чтобы содержать хотя бы номер выпуска.

4

Там в 3 макросы для GCC версии вы можете проверить на.

__GNUC_MINOR__ 
__GNUC_PATCHLEVEL__ 
__GNUC__ 

e.g. мой НКУ v 4.3.1 определяет их как таковые:

#define __GNUC_MINOR__ 1 
#define __GNUC_PATCHLEVEL__ 3 
#define __GNUC__ 4 

Вы можете увидеть "buitin" макросы, определенные работы

НКУ -E -dM -xc/DEV/нуль