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 для получения дополнительной информации. Имена ‘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. - ‘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. Это значение по умолчанию для C++-кода. Имя ‘gnu++1y’ устарело.
- ‘c++17’
- ‘c++1z’
-
Стандарт ISO C++ 2017 года плюс поправки. Имя ‘c++1z’ устарело.
- ‘gnu++17’
- ‘gnu++1z’
-
GNU диалект -std=c++17. Имя ‘gnu++1z’ устарело.
- ‘c++20’
- ‘c++2a’
-
Следующий пересмотр стандарта ISO C++, запланированный на 2020 год. Поддержка очень экспериментальная и, скорее всего, изменится несовместимым образом в будущих выпусках.
- ‘gnu++20’
- ‘gnu++2a’
GNU диалект -std=c++20. Поддержка очень экспериментальная и, скорее всего, изменится несовместимым образом в будущих выпусках.
-fgnu89-inline-
Опция -fgnu89-inline сообщает GCC использовать традиционную GNU семантику для функций
inlineпри работе в режиме C99. См. Функция-inline так же быстра, как макрос. Использование данной опции примерно равнозначно добавлению атрибута функцииgnu_inlineко всем 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’ соответственно в следующем символе). В случае определений функций, внутри комментариев после объявления, также предоставляется список аргументов в стиле K&R, после которого следуют их объявления.
-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. Это экспериментальная функция, которая позволяет проводить тестирование наборов GIMPLE. -fhosted-
Утверждать, что компиляция направлена на среду размещения. Это подразумевает -fbuiltin. Размещающая среда — это среда, в которой доступна вся стандартная библиотека, и в которой
mainимеет возвращаемый типint. Примеры — практически всё, кроме ядра. Это эквивалентно -fno-freestanding. -ffreestanding-
Утверждать, что компиляция направлена на автономную среду. Это подразумевает -fno-builtin. Автономная среда — это среда, в которой стандартная библиотека может отсутствовать, и запуск программы может не обязательно происходить в
main. Наиболее очевидным примером является ядро ОС. Это эквивалентно -fno-hosted.См. Поддерживаемые языковые стандарты GCC для получения подробной информации об автономных и размещающих средах.
-fopenacc-
Включить обработку директив OpenACC
#pragma accв C/C++ и!$accв Fortran. При указании -fopenacc, компилятор генерирует ускоренный код в соответствии с OpenACC Application Programming Interface v2.6 https://www.openacc.org. Этот параметр подразумевает -pthread, и поэтому поддерживается только на целевых платформах, поддерживающих -pthread. -fopenacc-dim=geom-
Указать значения по умолчанию для измерений вычислений для областей параллельной загрузки, которые их явно не указывают. Значение geom — тройка значений, разделённых двоеточием, для размеров «gang», «worker» и «vector» в указанном порядке. Размер можно опустить, чтобы использовать значение по умолчанию, специфичное для целевой платформы.
-fopenmp-
Включить обработку директив OpenMP
#pragma ompв C/C++ и!$ompв Fortran. При указании -fopenmp, компилятор генерирует параллельный код в соответствии с OpenMP Application Program Interface v4.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’s Transactional Memory (ревизия 1.1, 6 мая 2009 г.). Это экспериментальная функция, интерфейс которой может измениться в будущих версиях GCC, поскольку меняется официальная спецификация. Обратите внимание, что не все архитектуры поддерживают эту функцию.
Для получения дополнительной информации о поддержке транзакционной памяти в GCC см. Библиотеку GNU Transactional Memory в GNU Transactional Memory Library.
Обратите внимание, что функция транзакционной памяти не поддерживается с исключениями, не связанными с вызовами (-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-10.5.0/gcc/C-Dialect-Options.html