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, и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, этот макрос не определён, чтобы вы могли использовать этот макрос для определения используемого времени выполнения (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, если целевой процессор поддерживает атомарные операции сравнения и обмена на операндах длиной 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, чтобы файл заголовков 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, или по умолчанию.
__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-13.3.0/cpp/Common-Predefined-Macros.html