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

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

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

4 ответов


из руководства 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))

__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 -


есть 3 макроса для версии gcc, которую вы можете протестировать.

__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


с online docs:

__GNUC__
__ GNUC _ MINOR__
__ GNUC _ PATCHLEVEL__
Эти макросы определяются всеми компиляторами GNU, использующими препроцессор C: C, C++, Objective-C и Fortran. Их значениями являются основная версия, дополнительная версия и уровень исправления компилятора в виде целочисленных констант. Например, GCC 3.2.1 определит _ _ GNUC_ _ 3, _ _ GNUC _ MINOR _ _ 2 и__ GNUC_ PATCHLEVEL _ _ 1. Эти макросы определены если вы вызываете препроцессор напрямую.

и

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