Я столкнулся с ошибкой с gcc v3.4.4 и для размещения #ifdef в моем коде для работы с ошибкой только для этой версии компилятора.
Каковы предопределенные макросы для препроцессора компилятора GCC для определения номера версии компилятора?
Я столкнулся с ошибкой с gcc v3.4.4 и для размещения #ifdef в моем коде для работы с ошибкой только для этой версии компилятора.
Каковы предопределенные макросы для препроцессора компилятора GCC для определения номера версии компилятора?
Из руководства 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 -/dev/null | less
Есть 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
Из онлайн-документы:
__ GNUC__
__GNUC_MINOR__
__GNUC_PATCHLEVEL__
Эти макросы определяются всеми компиляторами GNU, которые используют препроцессор C: C, С++, Objective-C и Fortran. Их значениями являются основная версия, младшая версия и уровень исправления компилятора, как целочисленные константы. Например, GCC 3.2.1 определит __GNUC__ до 3, __GNUC_MINOR__ до 2 и __GNUC_PATCHLEVEL__ до 1. Эти макросы также определены, если вы вызываете препроцессор напрямую.
и
__ VERSION__
Этот макрос расширяется до строковой константы, которая описывает версию используемого компилятора. Вы не должны полагаться на его содержимое, имеющее какую-либо конкретную форму, но на него можно рассчитывать, чтобы содержать хотя бы номер выпуска.