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