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_ttypedef, соответственно. Они существуют для правильной работы стандартных заголовочных файлов stddef.h, stdint.h и wchar.h. Не следует использовать эти макросы напрямую; вместо этого следует включить соответствующие заголовочные файлы и использовать typedefs. Некоторые из этих макросов могут не быть определены на определённых системах, если 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++ с опцией -std=c++0x или -std=gnu++0x. Он указывает, что некоторые функции, вероятно, включенные в C++0x, доступны. Обратите внимание, что эти функции являются экспериментальными и могут быть изменены или удалены в будущих версиях GCC.
__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 байт соответственно.
__GCC_HAVE_DWARF2_CFI_ASM-
Этот макрос определен, когда компилятор генерирует директивы DWARF CFI для ассемблера. При определении этого макроса можно сгенерировать те же директивы в inline assembly.
__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 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, или по умолчанию.
Далее: Системно-зависимые предопределённые макросы, Предыдущий: Стандартные предопределённые макросы, Вверх: Предопределённые макросы [Оглавление][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-8.5.0/cpp/Common-Predefined-Macros.html