Spec-Zone.ru › GCC 12 CPP

3.7.2 Общие предопределённые макросы

Общие предопределённые макросы являются расширениями GNU C. Они доступны с одинаковым значением независимо от машины или операционной системы, на которой вы используете GNU C или GNU Fortran. Их имена начинаются с двойных подчёркиваний.

__COUNTER__

Этот макрос расширяется до последовательности целых значений, начиная с 0. В сочетании с оператором ##, это обеспечивает удобный способ генерации уникальных идентификаторов. Необходимо следить, чтобы __COUNTER__ не расширялся до включения предварительно скомпилированных заголовков, которые его используют. В противном случае предварительно скомпилированные заголовки не будут использованы.

__GFORTRAN__

Этот макрос определён компилятором GNU Fortran.

__GNUC__
__GNUC_MINOR__
__GNUC_PATCHLEVEL__

Эти макросы определяются всеми компиляторами GNU, использующими препроцессор C: C, C++, Objective-C и Fortran. Их значения — это главная версия, второстепенная версия и номер патча компилятора, как целочисленные константы. Например, версия GCC x.y.z определяет __GNUC__ как x, __GNUC_MINOR__ как y и __GNUC_PATCHLEVEL__ как z. Эти макросы также определяются, если вы вызываете препроцессор напрямую.

Если вам нужно только узнать, компилируется ли ваша программа 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))

Другой подход — использовать предопределённые макросы для вычисления одного числа, а затем сравнить это число с пороговым значением:

#define GCC_VERSION (__GNUC__ * 10000 \
                     + __GNUC_MINOR__ * 100 \
                     + __GNUC_PATCHLEVEL__)
…
/* Test for GCC > 3.2.0 */
#if GCC_VERSION > 30200

Многие находят эту форму более понятной.

__GNUG__

Компилятор GNU C++ определяет этот макрос. Проверка его эквивалентна проверке (__GNUC__ && __cplusplus).

__STRICT_ANSI__

GCC определяет этот макрос только в том случае, если при вызове GCC был указан переключатель -ansi или переключатель -std, указывающий на строгое соответствие какой-либо версии ISO C или ISO C++. Он определён как ‘1’. Этот макрос в основном предназначен для того, чтобы направить заголовочные файлы GNU libc использовать только определения, найденные в стандартном C.

__BASE_FILE__

Этот макрос расширяется до имени основного входного файла в виде константы строки C. Это исходный файл, который был указан в командной строке препроцессора или компилятора C.

__FILE_NAME__

Этот макрос расширяется до базового имени текущего входного файла в виде константы строки C. Это последняя часть пути, по которой препроцессор открыл файл. Например, обработка "/usr/local/include/myheader.h" установит этот макрос в "myheader.h".

__INCLUDE_LEVEL__

Этот макрос расширяется до целочисленной константы в десятичном формате, которая представляет собой глубину вложенности файлов включения. Значение этого макроса увеличивается при каждой директиве «#include» и уменьшается в конце каждого включённого файла. Оно начинает с 0 в базовом файле, указанном в командной строке.

__ELF__

Этот макрос определен, если целевая платформа использует формат объектов ELF.

__VERSION__

Этот макрос расширяется до строковой константы, описывающей используемую версию компилятора. Не следует полагаться на то, что его содержимое будет иметь какую-либо определённую форму, но можно рассчитывать на то, что оно будет содержать, по меньшей мере, номер релиза.

__OPTIMIZE__
__OPTIMIZE_SIZE__
__NO_INLINE__

Эти макросы описывают режим компиляции. __OPTIMIZE__ определён при всех оптимизирующих компиляциях. __OPTIMIZE_SIZE__ определён, если компилятор оптимизирует размер, а не скорость. __NO_INLINE__ определён, если ни одна функция не будет вставлена в свои вызывающие функции (при отсутствии оптимизации или когда вставка была специально отключена параметром -fno-inline).

Эти макросы заставляют определённые заголовочные файлы GNU предоставлять оптимизированные определения, используя макросы или встроенные функции, для функций системной библиотеки. Не следует использовать эти макросы каким-либо способом, не убедившись, что программы будут выполняться с тем же результатом, определены они или нет. Если они определены, их значение равно 1.

__GNUC_GNU_INLINE__

GCC определяет этот макрос, если функции, объявленные inline, будут обрабатываться в традиционном режиме gnu90 GCC. Файлы объектов будут содержать внешние видимые определения всех функций, объявленных inline без extern или static. Они не будут содержать никаких определений функций, объявленных extern inline.

__GNUC_STDC_INLINE__

GCC определяет этот макрос, если функции, объявленные inline, будут обрабатываться в соответствии со стандартами ISO C99 или более поздними. Файлы объектов будут содержать внешние видимые определения всех функций, объявленных extern inline. Они не будут содержать определений функций, объявленных inline без extern.

Если этот макрос определен, GCC поддерживает атрибут функции gnu_inline как способ всегда получить поведение gnu90.

__CHAR_UNSIGNED__

GCC определяет этот макрос, если и только если тип данных char беззнаковый на целевой машине. Он существует для правильной работы стандартного заголовочного файла limits.h. Не следует использовать этот макрос самостоятельно; вместо этого, обращайтесь к стандартным макросам, определённым в limits.h.

__WCHAR_UNSIGNED__

Как и __CHAR_UNSIGNED__, этот макрос определён, если и только если тип данных wchar_t беззнаковый, и фронтенд находится в режиме C++.

__REGISTER_PREFIX__

Этот макрос расширяется до одного токена (не строковой константы), который является префиксом, применяемым к именам регистров процессора в ассемблерном языке для данной целевой платформы. Вы можете использовать его для написания ассемблерного кода, пригодного для использования в нескольких средах. Например, в среде m68k-aout он расширяется до ничего, но в среде m68k-coff он расширяется до одного символа ‘%’.

__USER_LABEL_PREFIX__

Этот макрос расширяется до одного токена, который является префиксом, применяемым к пользовательским меткам (символам, видимым кодом C) в ассемблере. Например, в среде m68k-aout он расширяется до ‘_’, но в среде m68k-coff он расширяется до ничего.

Этот макрос будет иметь правильное определение, даже если используется -f(no-)underscores, но он не будет правильным, если используются платформозависимые параметры, которые изменяют этот префикс (например, параметр OSF/rose -mno-underscores).

__SIZE_TYPE__
__PTRDIFF_TYPE__
__WCHAR_TYPE__
__WINT_TYPE__
__INTMAX_TYPE__
__UINTMAX_TYPE__
__SIG_ATOMIC_TYPE__
__INT8_TYPE__
__INT16_TYPE__
__INT32_TYPE__
__INT64_TYPE__
__UINT8_TYPE__
__UINT16_TYPE__
__UINT32_TYPE__
__UINT64_TYPE__
__INT_LEAST8_TYPE__
__INT_LEAST16_TYPE__
__INT_LEAST32_TYPE__
__INT_LEAST64_TYPE__
__UINT_LEAST8_TYPE__
__UINT_LEAST16_TYPE__
__UINT_LEAST32_TYPE__
__UINT_LEAST64_TYPE__
__INT_FAST8_TYPE__
__INT_FAST16_TYPE__
__INT_FAST32_TYPE__
__INT_FAST64_TYPE__
__UINT_FAST8_TYPE__
__UINT_FAST16_TYPE__
__UINT_FAST32_TYPE__
__UINT_FAST64_TYPE__
__INTPTR_TYPE__
__UINTPTR_TYPE__

Эти макросы определены как соответствующие основанные типы для size_t, ptrdiff_t, wchar_t, wint_t, intmax_t, uintmax_t, sig_atomic_t, int8_t, int16_t, int32_t, int64_t, uint8_t, uint16_t, uint32_t, uint64_t, int_least8_t, int_least16_t, int_least32_t, int_least64_t, uint_least8_t, uint_least16_t, uint_least32_t, uint_least64_t, int_fast8_t, int_fast16_t, int_fast32_t, int_fast64_t, uint_fast8_t, uint_fast16_t, uint_fast32_t, uint_fast64_t, intptr_t, и uintptr_t типами соответственно. Они существуют для правильной работы стандартных заголовочных файлов stddef.h, stdint.h и wchar.h. Не следует использовать эти макросы напрямую; вместо этого, включайте соответствующие заголовочные файлы и используйте типы. Некоторые из этих макросов могут не быть определены на определённых системах, если GCC не предоставляет заголовочный файл stdint.h на этих системах.

__CHAR_BIT__

Определено число битов, используемых в представлении типа данных char. Оно существует для правильной работы стандартных заголовочных файлов, определяющих числовые ограничения. Не следует использовать этот макрос напрямую; вместо этого, включайте соответствующие заголовочные файлы.

__SCHAR_MAX__
__WCHAR_MAX__
__SHRT_MAX__
__INT_MAX__
__LONG_MAX__
__LONG_LONG_MAX__
__WINT_MAX__
__SIZE_MAX__
__PTRDIFF_MAX__
__INTMAX_MAX__
__UINTMAX_MAX__
__SIG_ATOMIC_MAX__
__INT8_MAX__
__INT16_MAX__
__INT32_MAX__
__INT64_MAX__
__UINT8_MAX__
__UINT16_MAX__
__UINT32_MAX__
__UINT64_MAX__
__INT_LEAST8_MAX__
__INT_LEAST16_MAX__
__INT_LEAST32_MAX__
__INT_LEAST64_MAX__
__UINT_LEAST8_MAX__
__UINT_LEAST16_MAX__
__UINT_LEAST32_MAX__
__UINT_LEAST64_MAX__
__INT_FAST8_MAX__
__INT_FAST16_MAX__
__INT_FAST32_MAX__
__INT_FAST64_MAX__
__UINT_FAST8_MAX__
__UINT_FAST16_MAX__
__UINT_FAST32_MAX__
__UINT_FAST64_MAX__
__INTPTR_MAX__
__UINTPTR_MAX__
__WCHAR_MIN__
__WINT_MIN__
__SIG_ATOMIC_MIN__

Определены до максимального значения типов signed char, wchar_t, signed short, signed int, signed long, signed long long, wint_t, size_t, ptrdiff_t, intmax_t, uintmax_t, sig_atomic_t, int8_t, int16_t, int32_t, int64_t, uint8_t, uint16_t, uint32_t, uint64_t, int_least8_t, int_least16_t, int_least32_t, int_least64_t, uint_least8_t, uint_least16_t, uint_least32_t, uint_least64_t, int_fast8_t, int_fast16_t, int_fast32_t, int_fast64_t, uint_fast8_t, uint_fast16_t, uint_fast32_t, uint_fast64_t, intptr_t, и до минимального значения типов wchar_t, wint_t, и sig_atomic_t соответственно. Они существуют для корректной работы стандартного заголовка, имеющего числовые ограничения. Не следует использовать эти макросы напрямую; вместо этого следует включать соответствующие заголовки. Некоторые из этих макросов могут быть не определены на определённых системах, если GCC не предоставляет заголовок stdint.h на этих системах.

__INT8_C
__INT16_C
__INT32_C
__INT64_C
__UINT8_C
__UINT16_C
__UINT32_C
__UINT64_C
__INTMAX_C
__UINTMAX_C

Определены для реализаций стандартных макросов stdint.h с теми же именами без лидирующей части __. Они существуют, чтобы обеспечить корректную работу реализации этого заголовка. Не следует использовать эти макросы напрямую; вместо этого следует включать соответствующие заголовки. Некоторые из этих макросов могут быть не определены на определённых системах, если GCC не предоставляет заголовок stdint.h на этих системах.

__SCHAR_WIDTH__
__SHRT_WIDTH__
__INT_WIDTH__
__LONG_WIDTH__
__LONG_LONG_WIDTH__
__PTRDIFF_WIDTH__
__SIG_ATOMIC_WIDTH__
__SIZE_WIDTH__
__WCHAR_WIDTH__
__WINT_WIDTH__
__INT_LEAST8_WIDTH__
__INT_LEAST16_WIDTH__
__INT_LEAST32_WIDTH__
__INT_LEAST64_WIDTH__
__INT_FAST8_WIDTH__
__INT_FAST16_WIDTH__
__INT_FAST32_WIDTH__
__INT_FAST64_WIDTH__
__INTPTR_WIDTH__
__INTMAX_WIDTH__

Определены для ширины разрядов соответствующих типов. Они существуют для обеспечения правильного поведения реализаций limits.h и stdint.h. Не следует использовать эти макросы напрямую; вместо этого следует включать соответствующие заголовки. Некоторые из этих макросов могут быть не определены на определённых системах, если GCC не предоставляет заголовок stdint.h на этих системах.

__SIZEOF_INT__
__SIZEOF_LONG__
__SIZEOF_LONG_LONG__
__SIZEOF_SHORT__
__SIZEOF_POINTER__
__SIZEOF_FLOAT__
__SIZEOF_DOUBLE__
__SIZEOF_LONG_DOUBLE__
__SIZEOF_SIZE_T__
__SIZEOF_WCHAR_T__
__SIZEOF_WINT_T__
__SIZEOF_PTRDIFF_T__

Определены для количества байтов стандартных типов данных C: int, long, long long, short, void *, float, double, long double, size_t, wchar_t, wint_t и ptrdiff_t.

__BYTE_ORDER__
__ORDER_LITTLE_ENDIAN__
__ORDER_BIG_ENDIAN__
__ORDER_PDP_ENDIAN__

__BYTE_ORDER__ определён как одно из значений __ORDER_LITTLE_ENDIAN__, __ORDER_BIG_ENDIAN__, или __ORDER_PDP_ENDIAN__ для отражения организации многобайтовых и многословных величин в памяти. Если __BYTE_ORDER__ равно __ORDER_LITTLE_ENDIAN__ или __ORDER_BIG_ENDIAN__, то многобайтовые и многословные величины организованы одинаково: байт (слово) с наименьшим адресом является наименее значимым или наиболее значимым байтом (словом) величины соответственно. Если __BYTE_ORDER__ равно __ORDER_PDP_ENDIAN__, то байты в 16-битных словах организованы в стиле little-endian, а 16-битные подслова 32-битной величины — в стиле big-endian.

Для тестирования используйте эти макросы так:

/* Test for a little-endian machine */
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
__FLOAT_WORD_ORDER__

__FLOAT_WORD_ORDER__ определён как одно из значений __ORDER_LITTLE_ENDIAN__ или __ORDER_BIG_ENDIAN__ для отражения организации слов многословных величин с плавающей точкой.

__DEPRECATED

Этот макрос определён со значением 1 при компиляции файла исходного кода C++ с включёнными предупреждениями о устаревших конструкциях. Эти предупреждения включены по умолчанию, но могут быть отключены с помощью -Wno-deprecated.

__EXCEPTIONS

Этот макрос определён со значением 1 при компиляции файла исходного кода C++ с включёнными исключениями. Если при компиляции файла используется -fno-exceptions, то этот макрос не определён.

__GXX_RTTI

Этот макрос определён со значением 1 при компиляции файла исходного кода C++ с включённой идентификацией типов во время выполнения. Если при компиляции файла используется -fno-rtti, то этот макрос не определён.

__USING_SJLJ_EXCEPTIONS__

Этот макрос определён со значением 1, если компилятор использует старый механизм, основанный на setjmp и longjmp для обработки исключений.

__GXX_EXPERIMENTAL_CXX0X__

Этот макрос определён при компиляции файла исходного кода C++ с включёнными функциями C++11, т.е. для всех диалектов языка C++ за исключением -std=c++98 и -std=gnu++98. Этот макрос устарел, но может использоваться для обнаружения экспериментальных функций C++0x в очень старых версиях GCC. С GCC 4.7.0 макрос __cplusplus определён правильно, поэтому большинство кода должно проверять __cplusplus >= 201103L, а не использовать этот макрос.

__GXX_WEAK__

Этот макрос определён при компиляции файла исходного кода C++. Он имеет значение 1, если компилятор будет использовать слабые символы, секции COMDAT или другие подобные техники для объединения символов с «нечёткой связью», которые определены в нескольких единицах трансляции. Если компилятор не будет объединять такие символы, этот макрос определён со значением 0. В общем случае пользовательскому коду не нужно использовать этот макрос; его цель — упростить реализацию библиотеки времени выполнения C++, поставляемой с G++.

__NEXT_RUNTIME__

Этот макрос определён со значением 1, если (и только если) используется NeXT-времени выполнения (как в -fnext-runtime) для Objective-C. Если используется GNU-времени выполнения, этот макрос не определён, так что вы можете использовать этот макрос для определения используемого времени выполнения (NeXT или GNU).

__LP64__
_LP64

Эти макросы определены со значением 1, если (и только если) компиляция выполняется для целевой платформы, где long int и указатели используют 64 бита, а int — 32 бита.

__SSP__

Этот макрос определён со значением 1, когда используется -fstack-protector.

__SSP_ALL__

Этот макрос определён со значением 2, когда используется -fstack-protector-all.

__SSP_STRONG__

Этот макрос определён со значением 3, когда используется -fstack-protector-strong.

__SSP_EXPLICIT__

Этот макрос определён со значением 4, когда используется -fstack-protector-explicit.

__SANITIZE_ADDRESS__

Этот макрос определён со значением 1, когда используется -fsanitize=address или -fsanitize=kernel-address.

__SANITIZE_THREAD__

Этот макрос определён со значением 1, когда используется -fsanitize=thread.

__TIMESTAMP__

Этот макрос расширяется до строковой константы, которая описывает дату и время последнего изменения текущего файла исходного кода. Строковая константа содержит сокращённое название дня недели, месяца, числа, время в формате чч:мм:сс, год и имеет вид "Sun Sep 16 01:03:52 1973". Если число меньше 10, оно дополняется пробелом слева.

Если GCC не может определить текущую дату, он выведет сообщение об ошибке (один раз за компиляцию) и __TIMESTAMP__ будет расширяться до "??? ??? ?? ??:??:?? ????".

__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1
__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2
__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4
__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8
__GCC_HAVE_SYNC_COMPARE_AND_SWAP_16

Эти макросы определяются, если целевой процессор поддерживает атомарные операции сравнения и обмена для операндов длиной 1, 2, 4, 8 или 16 байт соответственно.

__HAVE_SPECULATION_SAFE_VALUE

Этот макрос определён со значением 1, чтобы показать, что эта версия GCC поддерживает __builtin_speculation_safe_value.

__GCC_HAVE_DWARF2_CFI_ASM

Этот макрос определён, когда компилятор генерирует директивы DWARF CFI для ассемблера. Если он определён, то можно сгенерировать эти же директивы в встроенном ассемблере.

__FP_FAST_FMA
__FP_FAST_FMAF
__FP_FAST_FMAL

Эти макросы определены со значением 1, если бэкенд поддерживает встроенные функции fma, fmaf, и fmal, чтобы файл заголовка math.h мог определить макросы FP_FAST_FMA, FP_FAST_FMAF, и FP_FAST_FMAL для совместимости со стандартом C 1999.

__FP_FAST_FMAF16
__FP_FAST_FMAF32
__FP_FAST_FMAF64
__FP_FAST_FMAF128
__FP_FAST_FMAF32X
__FP_FAST_FMAF64X
__FP_FAST_FMAF128X

Эти макросы определены со значением 1, если бэкенд поддерживает функции fma с использованием дополнительных типов _Floatn и _Floatnx, определённых в ISO/IEC TS 18661-3:2015. Файл заголовка math.h может определить макросы FP_FAST_FMAFn и FP_FAST_FMAFnx, если пользователь определил __STDC_WANT_IEC_60559_TYPES_EXT__ перед включением math.h.

__GCC_IEC_559

Данный макрос определён для указания предполагаемого уровня поддержки арифметики с плавающей точкой IEEE 754 (IEC 60559). Он расширяется до целого неотрицательного значения. Если 0, это указывает, что сочетание конфигурации компилятора и командной строки не предполагает поддержку арифметики IEEE 754 для float и double в соответствии с C99 и C11 Приложением F (например, что стандартные режимы округления и исключения не поддерживаются или что включены оптимизации, конфликтующие с семантикой IEEE 754). Если 1, это указывает, что поддержка арифметики IEEE 754 предполагается; это не означает, что все соответствующие языковые возможности поддерживаются GCC. Если 2 или более, это дополнительно указывает поддержку IEEE 754-2008 (в частности, что двоичные представления тихих и сигнализирующих NaN соответствуют указанным в IEEE 754-2008).

Данный макрос не указывает стандартное состояние опций командной строки, которые контролируют оптимизации, которые C99 и C11 разрешают контролировать стандартными директивами, где эти стандарты не требуют определённого стандартного состояния. Он не указывает, соблюдают ли оптимизации семантику сигнализирующих NaN (макрос для этого — __SUPPORT_SNAN__). Он не указывает поддержку десятичной плавающей точки или типов IEEE 754 binary16 и binary128.

__GCC_IEC_559_COMPLEX

Этот макрос определён для указания предполагаемого уровня поддержки арифметики с плавающей точкой IEEE 754 (IEC 60559) для комплексных чисел, как определено в C99 и C11 Приложении G. Он расширяется до целого неотрицательного значения. Если 0, это указывает, что сочетание конфигурации компилятора и опций командной строки не предполагает поддержку требований Приложения G (например, потому что использовалась -fcx-limited-range). Если 1 или более, это указывает, что предполагается поддержка этих требований; это не означает, что все соответствующие языковые возможности поддерживаются GCC.

__NO_MATH_ERRNO__

Этот макрос определён, если используется -fno-math-errno, или он включён другой опцией, такой как -ffast-math, или по умолчанию.

__RECIPROCAL_MATH__

Этот макрос определён, если используется -freciprocal-math, или он включён другой опцией, такой как -ffast-math, или по умолчанию.

__NO_SIGNED_ZEROS__

Этот макрос определён, если используется -fno-signed-zeros, или он включён другой опцией, такой как -ffast-math, или по умолчанию.

__NO_TRAPPING_MATH__

Этот макрос определён, если используется -fno-trapping-math.

__ASSOCIATIVE_MATH__

Этот макрос определён, если используется -fassociative-math, или он включён другой опцией, такой как -ffast-math, или по умолчанию.

__ROUNDING_MATH__

Этот макрос определён, если используется -frounding-math.

__GNUC_EXECUTION_CHARSET_NAME
__GNUC_WIDE_EXECUTION_CHARSET_NAME

Эти макросы определены для расширения до узкого строкового литерала имени узкого и широкого набора символов времени компиляции, используемого для выполнения. Он напрямую отражает имя, переданное опциям -fexec-charset и -fwide-exec-charset, или значения по умолчанию, описанные для этих опций (то есть, он может расширяться до чего-то вроде "UTF-8"). См. Вызов.

Далее: Системно-специфические предопределённые макросы, Предыдущее: Стандартные предопределённые макросы, Вверх: Предопределённые макросы [Оглавление][Индекс]

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-12.1.0/cpp/Common-Predefined-Macros.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API