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

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

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

26
задан rene 3 January 2017 в 19:07
поделиться

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)))
36
ответ дан 28 November 2019 в 06:42
поделиться

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

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

и

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

2
ответ дан 28 November 2019 в 06:42
поделиться

Есть 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

4
ответ дан 28 November 2019 в 06:42
поделиться

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

18
ответ дан 28 November 2019 в 06:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: