3.4 Параметры управления диалектом C
Следующие параметры управляют диалектом C (или языков, производных от C, таких как C++, Objective-C и Objective-C++), которые принимает компилятор:
-
-ansi -
В режиме C это эквивалентно -std=c90. В режиме C++, это эквивалентно -std=c++98.
Это отключает некоторые функции GCC, несовместимые со стандартом ISO C90 (при компиляции кода C) или со стандартным C++ (при компиляции кода C++), такие как ключевые слова
asmиtypeof, и предопределенные макросы, такие какunixиvax, которые идентифицируют тип используемой системы. Это также включает нежелательную и редко используемую функцию ISO триграфов. Для компилятора C это отключает распознавание комментариев в стиле C++ «//», а также ключевое словоinline.Альтернативные ключевые слова
__asm__,__extension__,__inline__и__typeof__продолжают работать несмотря на -ansi. Конечно, вы не захотите использовать их в программе ISO C, но полезно поместить их в заголовочные файлы, которые могут быть включены в компиляции, выполненные с -ansi. Также доступны альтернативные предопределенные макросы, такие как__unix__и__vax__, с -ansi или без него.Опция -ansi не приводит к случайному отклонению нестандартных программ. Для этого требуется -Wpedantic в дополнение к -ansi. Смотрите Опции для запроса или подавления предупреждений.
Макрос
__STRICT_ANSI__предопределен при использовании опции -ansi. Некоторые заголовочные файлы могут заметить этот макрос и воздержаться от объявления некоторых функций или определения некоторых макросов, которые не требуются стандартом ISO; это делается для того, чтобы избежать конфликтов с любыми программами, которые могут использовать эти имена для других целей.Функции, которые обычно являются встроенными, но не имеют семантики, определенной ISO C (такие как
allocaиffs), не являются встроенными функциями, когда используется -ansi. Смотрите Другие встроенные функции, предоставляемые GCC, для подробной информации о затронутых функциях. -
-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). То же самое, что и -ansi для кода C.
- ‘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» устарело.
- ‘gnu90’
- ‘gnu89’
-
Диалект GNU ISO C90 (включая некоторые функции C99).
- ‘gnu99’
- ‘gnu9x’
-
Диалект GNU ISO C99. Имя «gnu9x» устарело.
- ‘gnu11’
- ‘gnu1x’
-
Диалект GNU ISO C11. Имя «gnu1x» устарело.
- ‘gnu17’
- ‘gnu18’
-
Диалект GNU ISO C17. Это значение используется по умолчанию для кода C.
- ‘gnu23’
- ‘gnu2x’
-
Следующая версия стандарта ISO C, находящаяся в разработке, плюс расширения GNU. Поддержка этой версии является экспериментальной и неполной. Имя «gnu2x» устарело.
- ‘c++98’
- ‘c++03’
-
Стандарт ISO C++ 1998 года плюс техническая поправка 2003 года и некоторые дополнительные отчеты об ошибках. То же самое, что и -ansi для кода C++.
- ‘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++2b’
- ‘c++23’
-
Следующий пересмотр стандарта ISO C++, запланированный на 2023 год. Поддержка является очень экспериментальной и почти наверняка изменится несовместимым образом в будущих выпусках.
- ‘gnu++2b’
- ‘gnu++23’
-
Диалект GNU -std=c++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, см. в Другие встроенные функции, предоставляемые GCC.
GCC обычно генерирует специальный код для более эффективной обработки определенных встроенных функций; например, вызовы
allocaмогут превратиться в отдельные инструкции, которые непосредственно изменяют стек, а вызовыmemcpyмогут превратиться в встроенные циклы копирования. Результирующий код часто бывает и меньше, и быстрее, но поскольку вызовы функций больше не отображаются как таковые, вы не можете установить точку останова на эти вызовы, а также изменить поведение функций, подключая другую библиотеку. Кроме того, когда функция распознается как встроенная функция, GCC может использовать информацию об этой функции для выдачи предупреждений о проблемах с вызовами этой функции или для генерации более эффективного кода, даже если результирующий код все еще содержит вызовы этой функции. Например, предупреждения выдаются с -Wformat для неправильных вызововprintfпри встроенности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. Это экспериментальная функция, которая позволяет проводить unit-тестирование проходов GIMPLE. -
-fgnu-tm -
Когда задана опция -fgnu-tm, компилятор генерирует код для варианта Linux спецификации текущего ABI транзакционной памяти Intel (ревизия 1.1, 6 мая 2009 г.). Это экспериментальная функция, интерфейс которой может измениться в будущих версиях GCC, поскольку изменяется официальная спецификация. Обратите внимание, что данная функция не поддерживается на всех архитектурах.
Дополнительную информацию о поддержке GCC транзакционной памяти см. в Библиотеке GNU Transactional Memory в библиотеке GNU Transactional Memory.
Обратите внимание, что функция транзакционной памяти не поддерживается с исключениями вне вызовов (-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.Препроцессорные макросы
__GNUC_GNU_INLINE__и__GNUC_STDC_INLINE__можно использовать для проверки, какие семантики применяются кinlineфункциям. См. Общие предопределённые макросы в Предпроцессоре C. -
-fhosted -
Утверждение, что компиляция нацелена на размещённую среду. Это подразумевает -fbuiltin. Размещённая среда — это среда, в которой доступна вся стандартная библиотека, и в которой
Это эквивалентно -fno-freestanding.mainимеет тип возвращаемого значенияint. Примеры — почти всё, кроме ядра. -
-flax-vector-conversions -
Разрешить неявные преобразования между векторами с разным количеством элементов и/или несовместимыми типами элементов. Эту опцию не следует использовать в новом коде.
-
-fms-extensions -
Принимать некоторые нестандартные конструкции, используемые в заголовочных файлах Microsoft.
В коде C++ это позволяет именам членов в структурах быть похожими на объявления предыдущих типов.
typedef int UOW; struct ABC { UOW UOW; };В некоторых случаях неопределённых полей в структурах и объединениях они принимаются только с этой опцией. Подробнее см. в Неименованные поля структур/объединений в структурах/объединениях.
Обратите внимание, что эта опция выключена для всех целей, кроме x86-целей, использующих ms-abi.
-
-foffload=disable -foffload=default-foffload=target-list-
Указывает, для каких целевых платформ OpenMP и OpenACC должен генерироваться код. По умолчанию, эквивалентно -foffload=default, код генерируется для всех поддерживаемых целевых платформ. Форма -foffload=disable генерирует код только для отката на хост, а -foffload=target-list — только для указанного перечислением через запятую списка целевых платформ.
Целевые платформы задаются в внутреннем формате целевых триплетов GCC. Вы можете запустить компилятор с -v, чтобы увидеть список настроенных целевых платформ OpenMP в
OFFLOAD_TARGET_NAMES. -
-foffload-options=options -foffload-options=target-triplet-list=options-
При использовании -foffload-options=options, GCC передаёт указанные options компиляторам для всех активных целевых платформ offloading. Вы можете указать опции, относящиеся только к определённой платформе или платформам, используя форму -foffload-options=target-list=options. target-list — это список целевых платформ, разделенных запятыми, в том же формате, что и для опции -foffload=.
Типичные командные строки:
-foffload-options='-fno-math-errno -ffinite-math-only' -foffload-options=nvptx-none=-latomic -foffload-options=amdgcn-amdhsa=-march=gfx906
-
-fopenacc -
Включить обработку директив OpenACC ‘#pragma acc’ в C/C++ и ‘!$acc’ в свободной форме Fortran, а также ‘!$acc’, ‘c$acc’ и ‘*$acc’ в Fortran с фиксированной формой. При указании -fopenacc, компилятор генерирует ускоренный код в соответствии с API OpenACC Application Programming Interface v2.6 https://www.openacc.org. Эта опция подразумевает -pthread, и поэтому поддерживается только на платформах, поддерживающих -pthread.
-
-fopenacc-dim=geom -
Указать размер по умолчанию для вычислений в регионах параллельного offloading, которые не задают размер явным образом. Значение geom — тройка размеров, разделённых двоеточием: «gang», «worker» и «vector». Размер можно опустить, чтобы использовать размер по умолчанию, специфичный для целевой платформы.
-
-fopenmp -
Включить обработку директив OpenMP ‘#pragma omp’, ‘[[omp::directive(...)]]’, ‘[[omp::sequence(...)]]’ и ‘[[omp::decl(...)]]’ в C/C++ и ‘!$omp’ в Fortran. Также включается маркер условной компиляции ‘!$’ в Fortran. В Fortran с фиксированной формой строки, маркеры также могут начинаться с ‘c’ или ‘*’. При указании -fopenmp, компилятор генерирует параллельный код в соответствии с API OpenMP Application Program Interface v4.5 https://www.openmp.org. Эта опция подразумевает -pthread и поэтому поддерживается только на платформах, поддерживающих -pthread. -fopenmp подразумевает -fopenmp-simd.
-
-fopenmp-simd
-
Включить обработку директив OpenMP
simd,declare simd,declare reduction,assume,ordered,scanиloop, а также объединённых или составных директив сsimdв качестве составляющей с#pragma omp,[[omp::directive(...)]],[[omp::sequence(...)]]и[[omp::decl(...)]]в C/C++ и!$ompв Fortran. Кроме того, включает в Fortran условный препроцессорный маркер ‘!$’. В Fortran с фиксированной формой исходного текста маркеры также могут начинаться с ‘c’ или ‘*’. Другие директивы OpenMP игнорируются. Если дополнительно не указан параметр -fopenmp, областьloopпривязывается к текущей области задач, независимо от указанного параметраbind. -
-fopenmp-target-simd-clone -fopenmp-target-simd-clone=device-type-
Помимо генерации SIMD-клонов для функций, помеченных директивой
declare simd, GCC также генерирует клоны для функций, помеченных директивой OpenMPdeclare target, пригодные для векторизации, когда этот параметр активен. Тип устройства device-type может быть одним изnone,host,nohost, иany, которые соответствуют ключевым словам для параметраdevice_typeдирективыdeclare target; клоны генерируются для пересечения указанных устройств. -fopenmp-target-simd-clone эквивалентно -fopenmp-target-simd-clone=any, а -fno-openmp-target-simd-clone эквивалентно -fopenmp-target-simd-clone=none.При -O2 и выше (но не -Os или -Og) эта оптимизация по умолчанию устанавливается в -fopenmp-target-simd-clone=nohost; в противном случае она отключена по умолчанию.
-
-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, что является самым строгим вариантом; все заключительные массивы структур рассматриваются как гибкие члены массива.
Отрицательная форма -fno-strict-flex-arrays эквивалентна -fstrict-flex-arrays=0, что является наименее строгим вариантом. В этом случае заключительный массив рассматривается как гибкое член массива только в случае, когда он объявлен как гибкое член массива в соответствии со стандартом C99 и последующих версий.
Возможные значения level такие же, как для атрибута
strict_flex_array(см. Указание атрибутов переменных).Вы можете управлять этим поведением для определённого заключительного поля массива структуры с помощью атрибута переменной
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-14.2.0/gcc/C-Dialect-Options.html