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