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’ устарело.
- ‘c17’
- ‘c18’
- ‘iso9899:2017’
- ‘iso9899:2018’
-
ISO C17, пересмотр стандарта ISO C 2017 года (ожидается публикация в 2018 году). Этот стандарт такой же, как C11, за исключением исправления дефектов (все из которых также применяются с -std=c11) и нового значения
__STDC_VERSION__, и поэтому поддерживается в той же степени, что и C11. - ‘gnu90’
- ‘gnu89’
-
GNU диалект ISO C90 (включая некоторые функции C99).
- ‘gnu99’
- ‘gnu9x’
-
GNU диалект ISO C99. Имя ‘gnu9x’ устарело.
- ‘gnu11’
- ‘gnu1x’
-
GNU диалект ISO C11. Имя ‘gnu1x’ устарело.
- ‘gnu17’
- ‘gnu18’
-
GNU диалект ISO C17. Это значение по умолчанию для кода C.
- ‘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_’. Подробнее о затрагиваемых функциях, включая те, которые не являются встроенными при использовании опций -ansi или -std для строгого соответствия стандарту ISO C, потому что у них нет стандартного значения ISO, см. Другие встроенные функции, предоставляемые GCC.
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 версии 2.0 https://www.openacc.org. Эта опция подразумевает -pthread, и поэтому поддерживается только на целевых платформах, поддерживающих -pthread. -fopenacc-dim=geom-
Указать значения по умолчанию для измерений вычислений в параллельных регионах offload, которые их не указывают. Значение geom представляет собой тройку размеров, разделенных символом ‘:’, в порядке ‘gang’, ‘worker’ и ‘vector’. Размер можно опустить, чтобы использовать целевой размер по умолчанию.
-fopenmp-
Включить обработку директив OpenMP
#pragma ompв C/C++ и!$ompв Fortran. При указании -fopenmp, компилятор генерирует параллельный код в соответствии с интерфейсом программирования приложений OpenMP версии 4.5 http://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; };Некоторые случаи безымянных полей в структурах и объединениях принимаются только с этой опцией. Подробнее см. Безымянные поля struct/union в structs/unions.
Обратите внимание, что эта опция отключена для всех целевых платформ, кроме x86, использующих ms-abi.
-fplan9-extensions-
Принимать некоторые нестандартные конструкции, используемые в коде Plan 9.
Это включает -fms-extensions, разрешает передачу указателей на структуры с анонимными полями функциям, которые ожидают указатели на элементы типа поля, и разрешает ссылки на анонимные поля, объявленные с использованием typedef. Подробнее см. Безымянные поля struct/union в structs/unions. Это поддерживается только для 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 генерировать код, не совместимый с кодом, сгенерированным без него, если указанный порядок байтов не является родным для целевой платформы.
Следующее: Опции диалекта C++, Предыдущее: Вызов G++, Вверх: Вызов GCC [Содержание][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-8.5.0/gcc/C-Dialect-Options.html