Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

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

__GNUC_MINOR__ 
 __GNUC_PATCHLEVEL__ 
 __GNUC__ 

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

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

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

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

Ответ 4

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

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

и

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