Spec-Zone.ru › GCC 15

3.4 Параметры управления диалектом C

Следующие параметры управляют диалектом C (или производных от C языков, таких как C++, Objective-C и Objective-C++), который принимает компилятор:

-ansi

В режиме C это эквивалентно -std=c90. В режиме C++ это эквивалентно -std=c++98.

-std=

Определяет стандарт языка. Подробные сведения о версиях стандартов см. в разделе Поддерживаемые GCC стандарты языков. В настоящее время этот параметр поддерживается только при компиляции C или C++.

Компилятор может принимать несколько базовых стандартов, таких как ‘c90’ или ‘c++98’, а также диалекты GNU этих стандартов, такие как ‘gnu90’ или ‘gnu++98’. Если указан базовый стандарт, компилятор принимает все программы, соответствующие этому стандарту, а также программы, использующие расширения GNU, которые ему не противоречат. Например, -std=c90 отключает некоторые возможности GCC, несовместимые с ISO C90, такие как ключевые слова asm и typeof, но не другие расширения GNU, не имеющие значения в ISO C90, например пропуск среднего операнда выражения ?:. С другой стороны, если указан диалект GNU стандарта, включаются все поддерживаемые компилятором возможности, даже если они меняют значение базового стандарта. В результате некоторые программы, строго соответствующие стандарту, могут быть отклонены. Указанный стандарт используется параметром -Wpedantic для определения того, какие возможности считаются расширениями GNU относительно данной версии стандарта. Например, -std=gnu90 -Wpedantic выдаёт предупреждение о комментариях в стиле C++ ‘//’, тогда как -std=gnu99 -Wpedantic этого не делает.

Для этого параметра необходимо указать значение; возможны следующие значения:

‘c90’
‘c89’
‘iso9899:1990’

Поддержка всех программ ISO C90 (некоторые расширения GNU, конфликтующие с ISO C90, отключены). Для кода C эквивалентно -ansi.

‘iso9899:199409’

ISO C90 с изменениями, внесёнными поправкой 1.

‘c99’
‘c9x’
‘iso9899:1999’
‘iso9899:199x’

ISO C99. Этот стандарт поддерживается практически полностью, за исключением ошибок и проблем с плавающей точкой (в основном, но не исключительно, связанных с необязательными возможностями C99 из приложений F и G). Дополнительную информацию см. на странице https://gcc.gnu.org/c99status.html. Имена ‘c9x’ и ‘iso9899:199x’ устарели.

‘c11’
‘c1x’
‘iso9899:2011’

ISO C11, редакция стандарта ISO C 2011 года. Этот стандарт поддерживается практически полностью, за исключением ошибок, проблем с плавающей точкой (в основном, но не исключительно, связанных с необязательными возможностями C11 из приложений F и G), а также необязательных приложений K (интерфейсы проверки границ) и L (анализируемость). Имя ‘c1x’ устарело.

‘c17’
‘c18’
‘iso9899:2017’
‘iso9899:2018’

ISO C17, редакция стандарта ISO C 2017 года (опубликована в 2018 году). Этот стандарт совпадает с C11, за исключением исправлений ошибок (которые также применяются при использовании -std=c11) и нового значения __STDC_VERSION__, поэтому поддерживается в той же степени, что и C11.

‘c23’
‘c2x’
‘iso9899:2024’

ISO C23, редакция стандарта ISO C 2023 года (опубликована в 2024 году). Имя ‘c2x’ устарело.

‘c2y’

Следующая версия стандарта ISO C, которая ещё разрабатывается. Поддержка этой версии является экспериментальной и неполной.

‘gnu90’
‘gnu89’

Диалект GNU стандарта ISO C90 (включая некоторые возможности C99).

‘gnu99’
‘gnu9x’

Диалект GNU стандарта ISO C99. Имя ‘gnu9x’ устарело.

‘gnu11’
‘gnu1x’

Диалект GNU стандарта ISO C11. Имя ‘gnu1x’ устарело.

‘gnu17’
‘gnu18’

Диалект GNU стандарта ISO C17.

‘gnu23’
‘gnu2x’

Диалект GNU стандарта ISO C23. Используется по умолчанию для кода C. Имя ‘gnu2x’ устарело.

‘gnu2y’

Следующая версия стандарта ISO C, которая ещё разрабатывается, вместе с расширениями GNU. Поддержка этой версии является экспериментальной и неполной. Имя ‘gnu2x’ устарело.

‘c++98’
‘c++03’

Стандарт ISO C++ 1998 года, техническая поправка 2003 года и некоторые дополнительные отчёты об ошибках. Для кода C++ эквивалентно -ansi.

‘gnu++98’
‘gnu++03’

Диалект GNU параметра -std=c++98.

‘c++11’
‘c++0x’

Стандарт ISO C++ 2011 года с поправками. Имя ‘c++0x’ устарело.

‘gnu++11’
‘gnu++0x’

Диалект GNU параметра -std=c++11. Имя ‘gnu++0x’ устарело.

‘c++14’
‘c++1y’

Стандарт ISO C++ 2014 года с поправками. Имя ‘c++1y’ устарело.

‘gnu++14’
‘gnu++1y’

Диалект GNU параметра -std=c++14. Имя ‘gnu++1y’ устарело.

‘c++17’
‘c++1z’

Стандарт ISO C++ 2017 года с поправками. Имя ‘c++1z’ устарело.

‘gnu++17’
‘gnu++1z’

Диалект GNU параметра -std=c++17. Используется по умолчанию для кода C++. Имя ‘gnu++1z’ устарело.

‘c++20’
‘c++2a’

Стандарт ISO C++ 2020 года с поправками. Поддержка является экспериментальной и может измениться несовместимым образом в будущих выпусках. Имя ‘c++2a’ устарело.

‘gnu++20’
‘gnu++2a’

Диалект GNU параметра -std=c++20. Поддержка является экспериментальной и может измениться несовместимым образом в будущих выпусках. Имя ‘gnu++2a’ устарело.

‘c++23’
‘c++2b’

Стандарт ISO C++ 2023 года с поправками (опубликован в 2024 году). Поддержка является экспериментальной и может измениться несовместимым образом в будущих выпусках. Имя ‘c++2b’ устарело.

‘gnu++23’
‘gnu++2b’

Диалект GNU параметра -std=c++23. Поддержка является экспериментальной и может измениться несовместимым образом в будущих выпусках. Имя ‘gnu++2b’ устарело.

‘c++2c’
‘c++26’

Следующая редакция стандарта ISO C++, запланированная на 2026 год. Поддержка является крайне экспериментальной и почти наверняка изменится несовместимым образом в будущих выпусках.

‘gnu++2c’
‘gnu++26’

Диалект GNU параметра -std=c++2c. Поддержка является крайне экспериментальной и почти наверняка изменится несовместимым образом в будущих выпусках.

-aux-info filename

Выводит в указанный файл объявления с прототипами всех функций, объявленных и/или определённых в единице трансляции, в том числе в заголовочных файлах. Этот параметр без предупреждения игнорируется для всех языков, кроме C.

Помимо объявлений, в комментариях к файлу указывается источник каждого объявления (исходный файл и строка), является ли объявление неявным, с прототипом или без прототипа (соответственно ‘I’, ‘N’ для нового или ‘O’ для старого в первом символе после номера строки и двоеточия), а также получено ли оно из объявления или определения (соответственно ‘C’ или ‘F’ в следующем символе). Для определений функций после объявления в комментариях также приводится список аргументов в стиле K&R с их объявлениями.

-fno-asm

Не распознавать asm, inline или typeof как ключевые слова, чтобы эти слова можно было использовать в коде как идентификаторы. Вместо них можно использовать ключевые слова __asm__, __inline__ и __typeof__. В C параметр -ansi подразумевает -fno-asm.

В C++ inline является стандартным ключевым словом, и этот переключатель на него не влияет. Вместо этого можно использовать флаг -fno-gnu-keywords, который отключает typeof, но не asm и inline. В режиме C99 (-std=c99 или -std=gnu99) этот переключатель влияет только на ключевые слова asm и typeof, поскольку inline является стандартным ключевым словом ISO C99. В режиме C23 (-std=c23 или -std=gnu23) этот переключатель влияет только на ключевое слово asm, поскольку typeof является стандартным ключевым словом ISO C23.

-fno-builtin
-fno-builtin-function

Не распознавать встроенные функции, имена которых не начинаются с префикса ‘__builtin_’. Сведения о затрагиваемых функциях, включая функции, которые перестают быть встроенными при использовании параметров -ansi или -std для строгого соответствия ISO C из-за отсутствия у них значения в стандарте ISO, см. в разделе Встроенные функции библиотеки C.

Обычно GCC генерирует специальный код для более эффективной обработки некоторых встроенных функций; например, вызовы alloca могут превращаться в отдельные инструкции, непосредственно корректирующие стек, а вызовы memcpy — во встроенные циклы копирования. Получаемый код часто меньше и быстрее, однако, поскольку вызовы функций больше не представлены в виде вызовов, для них нельзя установить точку останова, а поведение функций нельзя изменить, подключив другую библиотеку. Кроме того, если функция распознана как встроенная, GCC может использовать сведения о ней для предупреждения о проблемах с её вызовами или для генерации более эффективного кода, даже если в результирующем коде по-прежнему присутствуют вызовы этой функции. Например, для некорректных вызовов printf выдаются предупреждения с параметром -Wformat, если printf является встроенной функцией, а strlen заведомо не изменяет глобальную память.

С параметром -fno-builtin-function отключается только встроенная функция function. Имя function не должно начинаться с ‘__builtin_’. Если указано имя функции, которая в этой версии GCC не является встроенной, параметр игнорируется. Соответствующего параметра -fbuiltin-function не существует; если требуется выборочно включить встроенные функции при использовании -fno-builtin или -ffreestanding, можно определить макросы, например:

#define abs(n)          __builtin_abs ((n))
#define strcpy(d, s)    __builtin_strcpy ((d), (s))
-fcond-mismatch

Разрешить условные выражения с несовпадающими типами второго и третьего аргументов. Значение такого выражения имеет тип void. Этот параметр не поддерживается для C++.

-ffreestanding

Утверждать, что компиляция выполняется для автономной среды. Это подразумевает -fno-builtin. В автономной среде стандартная библиотека может отсутствовать, а запуск программы может происходить не в точке main. Наиболее очевидный пример — ядро операционной системы. Эквивалентно -fno-hosted.

Сведения об автономных и хостируемых средах см. в разделе Поддерживаемые GCC стандарты языков.

-fgimple

Разрешить разбор определений функций, помеченных __GIMPLE. Это экспериментальная возможность, предназначенная для модульного тестирования проходов GIMPLE.

-fgnu-tm

Если указан параметр -fgnu-tm, компилятор генерирует код для варианта Linux текущей спецификации ABI транзакционной памяти Intel (редакция 1.1 от 6 мая 2009 года). Эта экспериментальная возможность может изменить интерфейс в будущих версиях GCC по мере изменения официальной спецификации. Обратите внимание, что эта возможность поддерживается не на всех архитектурах.

Дополнительные сведения о поддержке транзакционной памяти в GCC см. в разделе Библиотека транзакционной памяти GNU в руководстве по библиотеке транзакционной памяти GNU.

Обратите внимание, что возможность транзакционной памяти не поддерживается вместе с исключениями, не связанными с вызовами (-fnon-call-exceptions).

-fgnu89-inline

Параметр -fgnu89-inline указывает GCC использовать традиционную семантику GNU для функций inline в режиме C99. См. раздел Встраиваемая функция не уступает макросу в скорости. Использование этого параметра примерно эквивалентно добавлению атрибута функции gnu_inline ко всем встраиваемым функциям (см. раздел Объявление атрибутов функций).

Параметр -fno-gnu89-inline явно указывает GCC использовать семантику C99 для inline в режиме C99 или gnu99 (то есть задаёт поведение по умолчанию). Этот параметр не поддерживается в режиме -std=c90 или -std=gnu90.

Чтобы проверить, какая семантика применяется к функциям inline, можно использовать макросы препроцессора __GNUC_GNU_INLINE__ и __GNUC_STDC_INLINE__. См. раздел Общие предопределённые макросы в руководстве по препроцессору C.

-fhosted

Утверждать, что компиляция выполняется для хостируемой среды. Это подразумевает -fbuiltin. В хостируемой среде доступна вся стандартная библиотека, а main имеет тип возвращаемого значения int. К таким средам относится практически всё, кроме ядер операционных систем. Эквивалентно -fno-freestanding.

-flax-vector-conversions

Разрешить неявные преобразования между векторами с разным количеством элементов и/или несовместимыми типами элементов. Этот параметр не следует использовать в новом коде.

-fms-extensions

Принимать некоторые нестандартные конструкции, используемые в заголовочных файлах Microsoft.

В коде C++ это позволяет использовать для имён членов структур имена, совпадающие с именами ранее объявленных типов.

typedef int UOW;
struct ABC {
  UOW UOW;
};

Некоторые варианты безымянных полей в структурах и объединениях принимаются только с этим параметром. Подробные сведения см. в разделе Безымянные поля структур/объединений внутри структур/объединений.

Обратите внимание, что этот параметр отключён для всех целей, кроме целей x86, использующих ms-abi.

-fpermitted-flt-eval-methods=style

ISO/IEC TS 18661-3 определяет новые допустимые значения для FLT_EVAL_METHOD, указывающие, что операции и константы с семантическим типом, являющимся промежуточным или расширенным форматом, следует вычислять с точностью и диапазоном этого типа. Эти новые значения образуют надмножество значений, разрешённых C99/C11, где значение других положительных значений FLT_EVAL_METHOD не определено. Поэтому код, соответствующий C11, мог быть написан без учёта возможности появления новых значений.

Параметр -fpermitted-flt-eval-methods задаёт, должен ли компилятор разрешать только значения FLT_EVAL_METHOD, указанные в C99/C11, или расширенный набор значений, заданный в ISO/IEC TS 18661-3.

style может иметь значение c11 или ts-18661-3, в зависимости от требуемого поведения.

По умолчанию в режиме соответствия стандарту (-std=c11 или аналогичном) используется -fpermitted-flt-eval-methods=c11. По умолчанию в диалекте GNU (-std=gnu11 или аналогичном) используется -fpermitted-flt-eval-methods=ts-18661-3.

Параметры ‘-fdeps-*’ используются для извлечения структурированных сведений о зависимостях исходного файла. Для этого определяется, какие ресурсы из других исходных файлов потребуются для компиляции данного файла, а также какие ресурсы предоставляет сам файл. Эти сведения позволяют добавлять необходимые зависимости между правилами компиляции зависимых исходных файлов на основе их содержимого, не требуя отражать такую информацию в средствах сборки.

-fdeps-file=file

Задаёт место для записи структурированных сведений о зависимостях.

-fdeps-format=format

Задаёт формат структурированных сведений о зависимостях. На данный момент поддерживается только ‘p1689r5’. Обратите внимание: если указан этот аргумент, из вывода ‘-MF’ удаляется часть сведений (а именно сведения о модулях C++), чтобы вывод не использовал расширенный синтаксис makefile, который не понимает большинство инструментов.

-fdeps-target=file

Аналогичен -MT, но применяется к структурированным сведениям о зависимостях. Задаёт цель, которой в конечном счёте потребуются необходимые ресурсы и которая предоставит ресурсы, извлечённые из исходного файла, которые могут потребоваться другим исходным файлам.

-fplan9-extensions

Принимать некоторые нестандартные конструкции, используемые в коде Plan 9.

Этот параметр включает -fms-extensions, разрешает передавать указатели на структуры с анонимными полями функциям, ожидающим указатели на элементы типа этого поля, а также обращаться к анонимным полям, объявленным с помощью typedef. Подробные сведения см. в разделе Безымянные поля структур/объединений внутри структур/объединений. Поддерживается только для C, но не для C++.

-fsigned-bitfields
-funsigned-bitfields
-fno-signed-bitfields
-fno-unsigned-bitfields

Эти параметры задают, является ли битовое поле знаковым или беззнаковым, если в объявлении не используются ни signed, ни unsigned. По умолчанию такое битовое поле является знаковым, что согласуется с тем, что базовые целочисленные типы, такие как int, являются знаковыми.

-fsigned-char

Сделать тип char знаковым, как signed char.

Обратите внимание, что это эквивалентно -fno-unsigned-char, то есть отрицательной форме параметра -funsigned-char. Аналогично, параметр -fno-signed-char эквивалентен -funsigned-char.

-funsigned-char

Сделать тип char беззнаковым, как unsigned char.

Для каждого типа машины задано значение по умолчанию для char. По умолчанию он либо аналогичен unsigned char, либо аналогичен signed char.

В идеале переносимая программа всегда должна использовать signed char или unsigned char, если она зависит от знаковости объекта. Однако многие программы написаны с использованием обычного char и предполагают, что он знаковый или беззнаковый в зависимости от машины, для которой они предназначены. Этот параметр и его инверсия позволяют заставить такую программу работать с противоположным значением по умолчанию.

Тип char всегда является отдельным типом, отличным от signed char и unsigned char, хотя его поведение всегда совпадает с поведением одного из этих типов.

-fstrict-flex-arrays (C and C++ only)
-fstrict-flex-arrays=level (C and C++ only)

Управляет тем, когда завершающий массив структуры следует считать гибким элементом массива при обращении к его элементам. Значение level задаёт строгость проверки.

-fstrict-flex-arrays эквивалентен -fstrict-flex-arrays=3, то есть задаёт наиболее строгий режим: завершающий массив считается гибким элементом массива, только если он объявлен как гибкий элемент массива в соответствии со стандартом C99 или более поздним.

Отрицательная форма -fno-strict-flex-arrays эквивалентна -fstrict-flex-arrays=0, то есть задаёт наименее строгий режим. В этом случае все завершающие массивы структур считаются гибкими элементами массива.

Между уровнями 0 и 3 есть ещё два уровня, предназначенные для поддержки старого кода, в котором для гибких элементов массива используются расширение GCC с массивом нулевой длины (‘[0]’) или массив из одного элемента (‘[1]’). При значении level, равном 1, завершающий массив считается гибким элементом массива, если он объявлен как ‘[]’, ‘[0]’ или ‘[1]’. При значении level, равном 2, завершающий массив считается гибким элементом массива, если он объявлен как ‘[]’ или ‘[0]’.

Это поведение для конкретного завершающего поля массива структуры можно задать с помощью атрибута переменной strict_flex_array (см. раздел Задание атрибутов переменных).

Параметр -fstrict_flex_arrays взаимодействует с параметром -Wstrict-flex-arrays. Дополнительную информацию см. в разделе Параметры управления предупреждениями.

-fsso-struct=endianness

Задаёт порядок байтов по умолчанию для скалярных полей структур и объединений. Допустимые значения: ‘big-endian’, ‘little-endian’ и ‘native’ — порядок байтов целевой платформы (значение по умолчанию). Этот параметр не поддерживается для C++.

Предупреждение: если указанный порядок байтов не совпадает с порядком байтов целевой платформы, переключатель -fsso-struct заставляет GCC генерировать код, двоично несовместимый с кодом, созданным без этого переключателя.

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-15.3.0/gcc/C-Dialect-Options.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API