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 trigraph. Для компилятора 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’ устарело.
- ‘gnu90’
- ‘gnu89’
-
GNU диалект ISO C90 (включая некоторые функции C99).
- ‘gnu99’
- ‘gnu9x’
-
GNU диалект ISO C99. Название ‘gnu9x’ устарело.
- ‘gnu11’
- ‘gnu1x’
-
GNU диалект ISO C11. Это значение по умолчанию для кода C. Название ‘gnu1x’ устарело.
- ‘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++1z’
-
Следующий пересмотр стандарта ISO C++, предварительно запланированный на 2017 год. Поддержка является высокоэкспериментальной и, вероятно, изменится несовместимым образом в будущих выпусках.
- ‘gnu++1z’
GNU диалект -std=c++1z. Поддержка является высокоэкспериментальной и, вероятно, изменится несовместимым образом в будущих выпусках.
-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. -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))
-fhosted-
Утверждает, что компиляция нацелена на среду размещения. Это подразумевает -fbuiltin. Среда размещения — это среда, в которой доступна вся стандартная библиотека, и в которой
mainимеет возвращаемый типint. Примерами являются почти все, кроме ядра. Это эквивалентно -fno-freestanding. -ffreestanding-
Утверждает, что компиляция нацелена на автономную среду. Это подразумевает -fno-builtin. Автономная среда — это среда, в которой стандартная библиотека может отсутствовать, и запуск программы может не происходить обязательно в
main. Наиболее очевидным примером является ядро ОС. Это эквивалентно -fno-hosted.См. Поддерживаемые стандарты языка GCC для подробностей об автономных и размещенных средах.
-fopenacc-
Включить обработку директив OpenACC
#pragma accв C/C++ и!$accв Fortran. При указании -fopenacc, компилятор генерирует ускоренный код в соответствии с интерфейсом программирования приложений OpenACC v2.0 http://www.openacc.org/. Эта опция подразумевает -pthread, и, следовательно, поддерживается только на целевых платформах, поддерживающих -pthread. -fopenacc-dim=geom-
Указать значения по умолчанию для вычислительных измерений параллельных областей offload, которые не заданы явно. Значение geom представляет собой тройку размеров, разделенных символом «:», в порядке «gang», «worker» и «vector». Размер можно опустить, чтобы использовать значение по умолчанию, специфичное для целевой платформы.
-fopenmp-
Включить обработку директив OpenMP
#pragma ompв C/C++ и!$ompв Fortran. При указании -fopenmp, компилятор генерирует параллельный код в соответствии с интерфейсом программирования приложений OpenMP v4.0 http://www.openmp.org/. Эта опция подразумевает -pthread, и, следовательно, поддерживается только на целевых платформах, поддерживающих -pthread. -fopenmp подразумевает -fopenmp-simd. -fopenmp-simd-
Включить обработку директив OpenMP SIMD с
#pragma ompв C/C++ и!$ompв Fortran. Другие директивы OpenMP игнорируются. -fcilkplus-
Включить использование расширений языка Cilk Plus для C/C++. При указании опции -fcilkplus включается использование расширений языка Cilk Plus для C/C++. Текущая реализация соответствует ABI версии 1.2. Это экспериментальная функция, которая не полностью завершена, и её интерфейс может измениться в будущих версиях GCC по мере изменения официальной спецификации. В настоящее время реализованы все функции, кроме
_Cilk_for. -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; };Некоторые случаи безымянных полей в структурах и объединениях принимаются только с этой опцией. Подробнее см. Безымянные поля struct/union в struct/union.
Обратите внимание, что эта опция отключена для всех платформ, кроме x86, использующих ms-abi.
-fplan9-extensions-
Принимать некоторые нестандартные конструкции, используемые в коде Plan 9.
Это включает -fms-extensions, разрешает передачу указателей на структуры с анонимными полями функциям, ожидающим указателей на элементы типа поля, и разрешает ссылку на анонимные поля, объявленные с помощью typedef. Подробнее см. Безымянные поля struct/union в struct/union. Поддерживается только для C, а не для C++.
-trigraphs-
Поддержка триграфов ISO C. Опция -ansi (и опции -std для строгого соответствия стандарту ISO C) подразумевает -trigraphs.
-traditional-traditional-cpp-
Раньше эти опции заставляли GCC пытаться эмулировать компилятор C до стандарта. Теперь они поддерживаются только с переключателем -E. Препроцессор по-прежнему поддерживает режим до стандарта. Подробности см. в руководстве по GNU CPP.
-fcond-mismatch-
Разрешить условные выражения с несовпадающими типами во втором и третьем аргументах. Значение такого выражения — пустое. Эта опция не поддерживается для 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». Если опция не передается, компилятор использует родной порядок байтов целевой платформы. Эта опция не поддерживается для C++.
Предупреждение: переключатель -fsso-struct заставляет GCC генерировать код, который не бинарно совместим с кодом, сгенерированным без него, если указанный порядок байтов не является родным порядком байтов целевой платформы.
Далее: Опции диалекта C++, Предыдущая: Вызов G++, Вверх: Вызов GCC [Оглавление][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-6.5.0/gcc/C-Dialect-Options.html