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