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 стандарты языка.
Компилятор может принимать несколько базовых стандартов, таких как ‘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++.
- ‘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++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’ соответственно, в следующем символе). В случае определения функции также предоставляется список аргументов в стиле 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))
-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.Обратите внимание, что эта функция экспериментальная, неполная и может быть изменена в будущих версиях GCC. См. https://gcc.gnu.org/wiki/OpenACC для получения дополнительной информации.
-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 в документации библиотеки GNU Transactional Memory.
Обратите внимание, что функция транзакционной памяти не поддерживается с исключениями, не связанными с вызовами (-fnon-call-exceptions).
-fms-extensions-
Принимать некоторые нестандартные конструкции, используемые в заголовочных файлах Microsoft.
В коде C++ это позволяет именам членов структур быть похожими на предыдущие объявления типов.
typedef int UOW; struct ABC { UOW UOW; };Некоторые случаи безымянных полей в структурах и объединениях принимаются только с этой опцией. Подробности см. в Безымянные поля struct/union в structs/unions.
Обратите внимание, что эта опция выключена для всех целевых платформ, кроме x86, использующих ms-abi.
-fplan9-extensions-
Принимать некоторые нестандартные конструкции, используемые в коде Plan 9.
Это включает -fms-extensions, позволяет передавать указатели на структуры с безымянными полями функциям, ожидающим указатели на элементы типа поля, и позволяет ссылаться на безымянные поля, объявленные с помощью typedef. Подробности см. в Безымянные поля struct/union в structs/unions. Это поддерживается только для C, а не для C++.
-trigraphs-
Поддержка ISO C триграфов. Опция -ansi (и опции -std для строгого соответствия стандарту ISO C) подразумевает -trigraphs.
-traditional-traditional-cpp-
Ранее эти опции заставляли GCC пытаться эмулировать компилятор C до стандарта. Сейчас они поддерживаются только с переключателем -E. Препроцессор по-прежнему поддерживает режим до стандарта. Подробности см. в руководстве по GNU CPP.
-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, являются знаковыми типами.
Далее: Опции диалекта C++, Предыдущий: Вызов G++, Вверх: Вызов GCC [Оглавление][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-5.5.0/gcc/C-Dialect-Options.html