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