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