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++ с опцией -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 байтов, соответственно.
__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-9.5.0/cpp/Common-Predefined-Macros.html