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 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. Этот стандарт в значительной степени полностью поддерживается, за исключением ошибок, расширенных идентификаторов (поддерживается, за исключением крайних случаев при использовании
-fextended-identifiers) и проблем с плавающей точкой (в основном, но не полностью, связанные с необязательными функциями C99 из приложений F и G). Дополнительную информацию см. в http://gcc.gnu.org/c99status.html. Имена ‘c9x’ и ‘iso9899:199x’ устарели. - ‘
c11’- ‘
c1x’- ‘
iso9899:2011’ - ‘
- ISO C11, редакция стандарта ISO C 2011 года. Этот стандарт в значительной степени полностью поддерживается, за исключением ошибок, расширенных идентификаторов (поддерживается, за исключением крайних случаев при использовании
-fextended-identifiers) и проблем с плавающей точкой (в основном, но не полностью, связанные с необязательными функциями C11 из приложений F и G), а также необязательных приложений K (интерфейсы проверки границ) и L (анализ). Имя ‘c1x’ устарело. - ‘
gnu90’- ‘
gnu89’ - ‘
- Диалект GNU стандарта ISO C90 (включая некоторые функции C99). Это значение по умолчанию для кода C.
- ‘
gnu99’- ‘
gnu9x’ - ‘
- Диалект GNU стандарта ISO C99. Имя ‘
gnu9x’ устарело. - ‘
gnu11’- ‘
gnu1x’ - ‘
- Диалект GNU стандарта ISO C11. По умолчанию в будущих версиях GCC. Имя ‘
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++1y’ - Следующая редакция стандарта ISO C++, предварительно запланированная на 2014 год. Поддержка является высокоэкспериментальной и практически гарантированно изменится несовместимым образом в будущих выпусках.
- ‘
gnu++1y’ - Диалект GNU стандарта
-std=c++1y. Поддержка является высокоэкспериментальной и практически гарантированно изменится несовместимым образом в будущих выпусках.
- ‘
-fgnu89-inline- Параметр
-fgnu89-inlineсообщает GCC использовать традиционную семантику GNU для функцийinlineв режиме C99. См. Функция Inline столь же быстра, как макрос. Этот параметр принимается и игнорируется версиями GCC от 4.1.3 до, но не включая, 4.3. В версиях GCC 4.3 и выше он изменяет поведение GCC в режиме C99. Использование этого параметра примерно эквивалентно добавлению атрибута функцииgnu_inlineко всем встроенным функциям (см. Атрибуты функции).Параметр
-fno-gnu89-inlineявно сообщает GCC использовать семантику C99 для функцийinlineв режиме C99 или gnu99 (т.е. указывает поведение по умолчанию). Этот параметр впервые поддерживается в GCC 4.3. Этот параметр не поддерживается в режимах-std=c90или-std=gnu90.Препроцессорные макросы
__GNUC_GNU_INLINE__и__GNUC_STDC_INLINE__могут использоваться для проверки, какая семантика используется для функцийinline. См. Общие предопределённые макросы. -
-aux-infofilename - Вывод в указанный файл прототипированных объявлений всех функций, объявленных и/или определённых в единице трансляции, включая те, которые находятся в заголовочных файлах. Этот параметр молча игнорируется в любом языке, кроме 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 стандарты языка для получения подробностей об автономных и поддерживающих средах.
-fopenmp- Включает обработку директив OpenMP
#pragma ompв C/C++ и!$ompв Fortran. При указании-fopenmpкомпилятор генерирует параллельный код в соответствии с интерфейсом OpenMP Application Program Interface v4.0 http://www.openmp.org/. Эта опция подразумевает-pthread, и поэтому поддерживается только на целевых платформах, которые поддерживают-pthread.-fopenmpподразумевает-fopenmp-simd. -fopenmp-simd- Включает обработку SIMD-директив OpenMP с
#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; };В некоторых случаях анонимных полей в структурах и объединениях принимаются только с этой опцией. См. Анонимные поля структур/объединений в структурах/объединениях для получения подробностей.
Обратите внимание, что эта опция выключена для всех целевых платформ, кроме i?86 и x86_64, использующих ms-abi.
-fplan9-extensions- Принимает некоторые нестандартные конструкции, используемые в коде Plan 9.
Это включает
-fms-extensions, позволяет передавать указатели на структуры с анонимными полями функциям, которые ожидают указатели на элементы типа поля, и позволяет ссылаться на анонимные поля, объявленные с помощью typedef. См. Анонимные поля структур/объединений в структурах/объединениях для получения подробностей. Это поддерживается только для 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всегда является distinct-типом по отношению к каждому из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, которые являются типами со знаком.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-4.9.4/gcc/C-Dialect-Options.html