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