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, редакция 2011 года стандарта ISO C. Этот стандарт в значительной степени полностью поддерживается, за исключением ошибок, проблем с плавающей точкой (в основном, но не полностью, связанные с необязательными функциями C11 из приложений F и G), и необязательных приложений K (интерфейсы проверки границ) и L (анализируемость). Имя ‘c1x’ устарело.
- ‘c17’
- ‘c18’
- ‘iso9899:2017’
- ‘iso9899:2018’
-
ISO C17, редакция 2017 года стандарта ISO C (опубликована в 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++2a’
-
Следующая редакция стандарта ISO C++, ориентировочно запланирована на 2020 год. Поддержка очень экспериментальная и, скорее всего, изменится несовместимым образом в будущих выпусках.
- ‘gnu++2a’
GNU диалект -std=c++2a. Поддержка очень экспериментальная и, скорее всего, изменится несовместимым образом в будущих выпусках.
-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 может использовать информацию об этой функции, чтобы предупреждать о проблемах с вызовами этой функции или генерировать более эффективный код, даже если полученный код все еще содержит вызовы этой функции. Например, при плохих вызовахprintfс -Wformat при встроенном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.0 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 (редакция 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-
Разрешить условные выражения с несовместимыми типами во втором и третьем аргументах. Значение такого выражения — пустое. Эта опция не поддерживается для 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-
Установить порядок хранения скалярных данных структур и объединений по умолчанию в соответствии с указанной endianностью. Допустимые значения — ‘big-endian’, ‘little-endian’ и ‘native’ для родной endianности целевой платформы (по умолчанию). Эта опция не поддерживается для C++.
Предупреждение: переключатель -fsso-struct заставляет GCC генерировать код, не совместимый по двоичному представлению с кодом, сгенерированным без него, если указанная endianность не является родной для целевой платформы.
Далее: Опции диалекта C++, Предыдущее: Вызов G++, Наверх: Вызов GCC [Содержание][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-9.5.0/gcc/C-Dialect-Options.html