Каковы предопределенные макросы gcc для номера версии компилятора? - PullRequest
24 голосов
/ 20 декабря 2009

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

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

Ответы [ 4 ]

33 голосов
/ 20 декабря 2009

Из руководства gnu 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)))
18 голосов
/ 20 декабря 2009

__GNUC__, __GNUC_MINOR__ и __GNUC_PATCHLEVEL__.

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

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

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

gcc -E -dM - </ dev / null | меньше </p>

4 голосов
/ 20 декабря 2009

Для версии gcc вы можете протестировать 3 макроса.

__GNUC_MINOR__ 
 __GNUC_PATCHLEVEL__ 
 __GNUC__ 

например. мой gcc v 4.3.1 определяет их так:

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

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

gcc -E -dM -x c / dev / null

2 голосов
/ 20 декабря 2009

Из онлайн-документов :

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

и

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

...