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 определяет этот макрос тогда и только тогда, когда был указан переключатель -ansi или переключатель -std, указывающий на строгое соответствие какой-либо версии стандарта ISO C или ISO C++, при вызове GCC. Он определен как ‘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 (как в -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 для ассемблера. Когда это определено, можно генерировать те же самые директивы в inline-ассемблере.
__FP_FAST_FMA__FP_FAST_FMAF__FP_FAST_FMAL-
Эти макросы определены со значением 1, если бэкенд поддерживает встроенные функции
fma,fmaf, иfmal, так что файл include 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 Annex 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 Annex G. Он расширяется до целого неотрицательного значения. Если 0, это указывает, что комбинация конфигурации компилятора и командной строки не предназначена для поддержки требований Annex G (например, потому что использовалась -fcx-limited-range). Если 1 или больше, это указывает, что предполагается поддержка этих требований; это не означает, что все соответствующие возможности языка поддерживаются GCC.
__NO_MATH_ERRNO__-
Этот макрос определён, если используется -fno-math-errno или включён другой параметр, например, -ffast-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-11.4.0/cpp/Common-Predefined-Macros.html