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.
__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, иuintptr_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-runtime (как в -fnext-runtime) для Objective-C. Если используется GNU-runtime, этот макрос не определён, чтобы вы могли использовать этот макрос для определения используемой runtime (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, или по умолчанию.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-10.5.0/cpp/Common-Predefined-Macros.html