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 не приводит к отказу от не-ISO программ без необходимости. Для этого требуется -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). Дополнительную информацию см. в http://gcc.gnu.org/c99status.html.
- ‘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. - ‘c2x’
-
Следующая версия стандарта 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. Это значение по умолчанию для C-кода.
- ‘gnu2x’
-
Следующая версия стандарта ISO C, которая всё ещё разрабатывается, плюс расширения GNU. Поддержка этой версии экспериментальная и неполная.
- ‘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. Поддержка сильно экспериментальная и почти наверняка изменится несовместимым образом в будущих выпусках.
-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. -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.
-aux-info filename-
Выводит в указанный файл прототипы объявлений для всех функций, объявленных и/или определенных в единице трансляции, включая те, что находятся в заголовочных файлах. Этот параметр молча игнорируется в любом языке, кроме C.
Помимо объявлений, файл указывает в комментариях источник каждого объявления (исходный файл и строка), было ли объявление неявным, прототипированным или не прототипированным («I», «N» для новых или «O» для старых, соответственно, в первом символе после номера строки и двоеточия), и поступало ли оно из объявления или определения («C» или «F», соответственно).
-fallow-parameterless-variadic-functions-
Принимать функции с переменным числом аргументов без именованных параметров.
Хотя определить такую функцию возможно, это не очень полезно, так как прочитать аргументы невозможно. Это поддерживается только для C, так как такая конструкция разрешена в C++.
-fno-asm-
Не распознавать
asm,inlineилиtypeofкак ключевое слово, чтобы код мог использовать эти слова в качестве идентификаторов. Можно использовать ключевые слова__asm__,__inline__и__typeof__вместо них. -ansi подразумевает -fno-asm.В C++, этот переключатель влияет только на ключевое слово
typeof, посколькуasmиinlineявляются стандартными ключевыми словами. Вместо этого можно использовать флаг -fno-gnu-keywords, который имеет тот же эффект. В режиме C99 (-std=c99 или -std=gnu99) этот переключатель влияет только на ключевые словаasmиtypeof, посколькуinlineявляется стандартным ключевым словом в ISO C99. -fno-builtin-fno-builtin-function-
Не распознавать встроенные функции, которые не начинаются с префикса ‘__builtin_’. См. Другие встроенные функции, предоставляемые GCC для получения подробностей о затронутых функциях, включая те, которые не являются встроенными функциями, когда используются параметры -ansi или -std для строгой совместимости с ISO C, потому что они не имеют стандартного ISO значения.
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))
-fgimple-
Включить разбор определений функций, помеченных
__GIMPLE. Это экспериментальная функция, позволяющая проводить unit-тестирование пасов GIMPLE. -fhosted-
Утверждает, что компиляция направлена на размещённую среду. Это подразумевает -fbuiltin. Размещённая среда — это среда, в которой доступна вся стандартная библиотека и в которой
mainимеет возвращаемый типint. Примеры — почти всё, кроме ядра.Эквивалентно -fno-freestanding.
-ffreestanding-
Утверждает, что компиляция направлена на автономную среду. Это подразумевает -fno-builtin. Автономная среда — это среда, в которой стандартная библиотека может отсутствовать, и запуск программы необязательно происходит в
main. Самый очевидный пример — ядро ОС.Эквивалентно -fno-hosted.
См. Поддерживаемые GCC языковые стандарты для получения подробностей об автономных и размещённых средах.
-fopenacc-
Включить обработку директив OpenACC
#pragma accв C/C++ и!$accв Fortran. При указании -fopenacc компилятор генерирует ускоренный код в соответствии с интерфейсом программирования приложений OpenACC версии 2.6 https://www.openacc.org. Этот параметр подразумевает -pthread и, следовательно, поддерживается только на целевых платформах, поддерживающих -pthread. -fopenacc-dim=geom-
Указать значения по умолчанию для вычисления размеров параллельных областей offload, которые не указаны явно. Значение geom — тройка размеров, разделённых двоеточиями, в порядке «gang», «worker» и «vector». Размер можно опустить, чтобы использовать значение по умолчанию, специфичное для целевой платформы.
-fopenmp-
Включить обработку директив OpenMP
#pragma ompв C/C++ и!$ompв Fortran. При указании -fopenmp компилятор генерирует параллельный код в соответствии с интерфейсом программирования приложений OpenMP версии 4.5 https://www.openmp.org. Этот параметр подразумевает -pthread и, следовательно, поддерживается только на целевых платформах, поддерживающих -pthread. -fopenmp подразумевает -fopenmp-simd. -fopenmp-simd-
Включить обработку директив OpenMP SIMD с
#pragma ompв C/C++ и!$ompв Fortran. Другие директивы OpenMP игнорируются. -fgnu-tm-
При указании параметра -fgnu-tm компилятор генерирует код для варианта Linux текущей спецификации ABI для транзакционной памяти Intel (редакция 1.1, 6 мая 2009 г.). Это экспериментальная функция, интерфейс которой может измениться в будущих версиях GCC по мере изменения официальной спецификации. Обратите внимание, что не все архитектуры поддерживают эту функцию.
Для получения дополнительной информации о поддержке транзакционной памяти в GCC, см. Библиотеку GNU Transactional Memory.
Обратите внимание, что функция транзакционной памяти не поддерживается с исключениями, не связанными с вызовами (-fnon-call-exceptions).
-fms-extensions-
Принимать некоторые нестандартные конструкции, используемые в заголовочных файлах Microsoft.
В коде C++ это позволяет использовать имена членов в структурах, аналогичные предыдущим объявлениям типов.
typedef int UOW; struct ABC { UOW UOW; };Некоторые случаи безымянных полей в структурах и объединениях принимаются только с этим параметром. См. Безымянные поля структур/объединений в структурах/объединениях для получения подробностей.
Обратите внимание, что этот параметр отключен для всех платформ, кроме x86, использующих ms-abi.
-fplan9-extensions-
Принимать некоторые нестандартные конструкции, используемые в коде Plan 9.
Это включает -fms-extensions, разрешает передавать указатели на структуры с безымянными полями функциям, которые ожидают указатели на элементы типа поля, и разрешает ссылаться на безымянные поля, объявленные с помощью typedef. См. Безымянные поля структур/объединений в структурах/объединениях для получения подробностей. Поддерживается только для C, а не для C++.
-fcond-mismatch-
Разрешать условные выражения с несовпадающими типами во втором и третьем аргументах. Значение такого выражения — void. Этот параметр не поддерживается для C++.
-flax-vector-conversions-
Разрешать неявные преобразования между векторами с разным количеством элементов и/или несовместимыми типами элементов. Не следует использовать этот параметр для нового кода.
-funsigned-char-
Пусть тип
charбудет беззнаковым, какunsigned char.Для каждой машины есть значение по умолчанию для того, каким должен быть
char. Оно либо по умолчанию какunsigned char, либо какsigned char.В идеале, переносимая программа всегда должна использовать
signed charилиunsigned char, когда она зависит от знаковости объекта. Но многие программы были написаны, чтобы использовать обычныйcharи ожидать, что он будет со знаком или без знака, в зависимости от машин, для которых они были написаны. Этот параметр и его обратный вариант позволяют заставить такую программу работать с обратным значением по умолчанию.Тип
charвсегда является отличным типом от каждого изsigned charилиunsigned char, хотя его поведение всегда подобно одному из этих двух. -fsigned-char
-
Пусть тип
charбудет со знаком, какsigned char.Обратите внимание, что это эквивалентно -fno-unsigned-char, которое является отрицательной формой -funsigned-char. Аналогично, опция -fno-signed-char эквивалентна -funsigned-char.
-fsigned-bitfields-funsigned-bitfields-fno-signed-bitfields-fno-unsigned-bitfields-
Эти опции управляют тем, является ли битовое поле со знаком или без знака, когда объявление не использует ни
signedниunsigned. По умолчанию такое битовое поле является со знаком, так как это согласуется: базовые целочисленные типы, такие какint— это типы со знаком. -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-11.4.0/gcc/C-Dialect-Options.html