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 не приводит к тому, что нестандартные программы отклоняются без необходимости. Для этого требуется -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). Для получения дополнительной информации см. https://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. - ‘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. Имя «gnu++1y» устарело.
- ‘c++17’
- ‘c++1z’
-
Стандарт ISO C++ 2017 года плюс поправки. Имя «c++1z» устарело.
- ‘gnu++17’
- ‘gnu++1z’
-
Диалект GNU -std=c++17. Это значение используется по умолчанию для кода C++. Имя «gnu++1z» устарело.
- ‘c++20’
- ‘c++2a’
-
Стандарт ISO C++ 2020 года плюс поправки. Поддержка является экспериментальной и может измениться несовместимым образом в будущих выпусках. Имя «c++2a» устарело.
- ‘gnu++20’
- ‘gnu++2a’
-
Диалект GNU -std=c++20. Поддержка является экспериментальной и может измениться несовместимым образом в будущих выпусках. Имя «gnu++2a» устарело.
- ‘c++2b’
- ‘c++23’
-
Следующий пересмотр стандарта ISO C++, запланированный на 2023 год. Поддержка является экспериментальной, и почти наверняка изменится несовместимым образом в будущих выпусках.
- ‘gnu++2b’
- ‘gnu++23’
Диалект GNU -std=c++2b. Поддержка является экспериментальной, и почти наверняка изменится несовместимым образом в будущих выпусках.
-
-aux-info filename -
Выводит в указанный файл прототипированные объявления для всех функций, объявленных и/или определенных в трансляционной единице, включая те, которые находятся в заголовочных файлах. Этот параметр игнорируется без предупреждений в любом языке, кроме C.
Помимо объявлений, файл указывает в комментариях происхождение каждого объявления (исходный файл и строка), было ли объявление неявным, прототипированным или непрототипированным («I», «N» для нового или «O» для старого, соответственно, в первом символе после номера строки и двоеточия) и поступило ли оно из объявления или определения («C» или «F», соответственно, в следующем символе). В случае определений функций также предоставляется список аргументов в стиле K&R, за которым следуют их объявления, в комментариях после объявления.
-
-fno-asm
-
Не распознавать
asm,inlineилиtypeofкак ключевые слова, чтобы код мог использовать эти слова в качестве идентификаторов. Вы можете использовать ключевые слова__asm__,__inline__и__typeof__вместо этого. В C, -ansi подразумевает -fno-asm.В C++,
inline— стандартное ключевое слово и не затрагивается этим переключателем. Вы можете использовать флаг -fno-gnu-keywords вместо этого, который отключаетtypeof, но неasmиinline. В режиме C99 (-std=c99 или -std=gnu99) этот переключатель влияет только на ключевые словаasmиtypeof, посколькуinline— стандартное ключевое слово в ISO C99. В режиме C2X (-std=c2x или -std=gnu2x) этот переключатель влияет только на ключевое словоasm, посколькуtypeof— стандартное ключевое слово в ISO C2X. -
-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))
-
-fcond-mismatch -
Разрешить условные выражения с несовместимыми типами во втором и третьем аргументах. Значение такого выражения — void. Эта опция не поддерживается для C++.
-
-ffreestanding -
Утверждать, что компиляция ориентирована на автономную среду. Это подразумевает -fno-builtin. Автономная среда — это среда, в которой стандартная библиотека может отсутствовать, а запуск программы может не обязательно происходить в
main. Наиболее очевидным примером является ядро ОС. Это эквивалентно -fno-hosted.См. Поддерживаемые языковые стандарты GCC для получения подробностей об автономных и хост-средах.
-
-fgimple -
Включить разбор определений функций, помеченных
__GIMPLE. Это экспериментальная функция, которая позволяет проводить модульные тесты проходов GIMPLE. -
-fgnu-tm -
При указании опции -fgnu-tm компилятор генерирует код для варианта Linux спецификации ABI транзакционной памяти Intel (редакция 1.1, 6 мая 2009 г.). Это экспериментальная функция, интерфейс которой может измениться в будущих версиях GCC, поскольку меняется официальная спецификация. Обратите внимание, что для этой функции не все архитектуры поддерживаются.
Дополнительную информацию о поддержке GCC транзакционной памяти см. в Библиотеке GNU транзакционной памяти в Библиотеке GNU транзакционной памяти.
Обратите внимание, что функция транзакционной памяти не поддерживается с исключениями, не связанными с вызовами (-fnon-call-exceptions).
-
-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. -
-fhosted -
Утверждать, что компиляция ориентирована на хост-среду. Это подразумевает -fbuiltin. Хост-среда — это среда, в которой вся стандартная библиотека доступна и в которой
mainимеет возвращаемый типint. Примеры — почти всё, кроме ядра. -
-flax-vector-conversions -
Разрешить неявные преобразования между векторами с разным количеством элементов и/или несовместимыми типами элементов. Эту опцию не следует использовать в новом коде.
-
-fms-extensions -
Принимать некоторые нестандартные конструкции, используемые в заголовках файлов Microsoft.
В коде C++ это позволяет именам членов в структурах быть похожими на предыдущие объявления типов.
typedef int UOW; struct ABC { UOW UOW; };Некоторые случаи безымянных полей в структурах и объединениях принимаются только с этой опцией. См. Безымянные поля struct/union в struct/union для получения подробностей.
Обратите внимание, что эта опция выключена для всех целей, кроме целей x86, использующих ms-abi.
-
-foffload=disable -foffload=default-foffload=target-list-
Указать, для каких целей offload OpenMP и OpenACC должен генерироваться код. Стандартное поведение, эквивалентное -foffload=default, генерирует код для всех поддерживаемых целей offload. Форма -foffload=disable генерирует код только для хост-fallback, а -foffload=target-list генерирует код только для указанного списка целей offload, разделённых запятыми.
Цели offload задаются в внутреннем формате триплета GCC. Вы можете запустить компилятор с -v, чтобы увидеть список настроенных целей offload в
OFFLOAD_TARGET_NAMES. -
-foffload-options=options -foffload-options=target-triplet-list=options-
С -foffload-options=options GCC передаёт указанные options компиляторам для всех включённых целей offload. Вы можете указать параметры, применяемые только к определённой цели или целям, используя форму -foffload-options=target-list=options. target-list — это список целей, разделённых запятыми, в том же формате, что и для опции -foffload=.
Типичные командные строки:
-foffload-options=-lgfortran -foffload-options=-lm -foffload-options="-lgfortran -lm" -foffload-options=nvptx-none=-latomic -foffload-options=amdgcn-amdhsa=-march=gfx906 -foffload-options=-lm
-
-fopenacc -
Включить обработку директив OpenACC
#pragma accв C/C++ и!$accв Fortran. При указании -fopenacc, компилятор генерирует ускоренный код согласно спецификации OpenACC Application Programming Interface v2.6 https://www.openacc.org. Эта опция подразумевает -pthread, и поэтому поддерживается только на целях, которые поддерживают -pthread. -
-fopenacc-dim=geom -
Указать стандартные измерения вычислений для областей параллельного offload, которые не явно их не указывают. Значение geom — тройка размеров, разделённых двоеточием, в порядке ‘gang’, ‘worker’ и ‘vector’. Размер может быть опущен, чтобы использовать целевой размер по умолчанию.
-
-fopenmp -
Включить обработку директив OpenMP
#pragma ompв C/C++,[[omp::directive(...)]]и[[omp::sequence(...)]]в C++ и!$ompв Fortran. При указании -fopenmp компилятор генерирует параллельный код в соответствии с интерфейсом OpenMP Application Program Interface v4.5 https://www.openmp.org. Эта опция подразумевает -pthread и поэтому поддерживается только на целях, которые поддерживают -pthread. -fopenmp подразумевает -fopenmp-simd. -
-fopenmp-simd -
Включить обработку директив OpenMP
simd,declare simd,declare reduction,assume,ordered,scan,loopи комбинированных или составных директив сsimdкак составляющей с#pragma ompв C/C++,[[omp::directive(...)]]и[[omp::sequence(...)]]в C++ и!$ompв Fortran. Другие директивы OpenMP игнорируются. -
-fopenmp-target-simd-clone -fopenmp-target-simd-clone=device-type
-
Помимо генерации SIMD-клонов для функций, помеченных директивой
declare simd, GCC также генерирует клоны для функций, помеченных директивой OpenMPdeclare target, подходящие для векторизации, когда эта опция активна. device-type может быть одним изnone,host,nohost, иany, которые соответствуют ключевым словам дляdevice_type-атрибута директивыdeclare target; клоны генерируются для пересечения указанных устройств. -fopenmp-target-simd-clone эквивалентно -fopenmp-target-simd-clone=any, а -fno-openmp-target-simd-clone эквивалентно -fopenmp-target-simd-clone=none.При оптимизации -O2 и выше (но не -Os или -Og) эта оптимизация по умолчанию устанавливается как -fopenmp-target-simd-clone=nohost; в противном случае она отключена по умолчанию.
-
-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.
-
-fplan9-extensions -
Принимать некоторые нестандартные конструкции, используемые в коде Plan 9.
Это включает -fms-extensions, разрешает передавать указатели на структуры с анонимными полями функциям, ожидающим указатели на элементы типа поля, и разрешает ссылаться на анонимные поля, объявленные с помощью typedef. Подробности см. в Анонимные поля структур/объединений в структуре/объединении. Эта опция поддерживается только для C, а не для C++.
-
-fsigned-bitfields -funsigned-bitfields-fno-signed-bitfields-fno-unsigned-bitfields-
Эти параметры управляют тем, является ли битовое поле знаковым или беззнаковым, когда объявление не использует ни
signed, ниunsigned. По умолчанию такое битовое поле знаковое, потому что это согласуется: базовые целочисленные типы, такие какint, являются знаковыми типами. -
-fsigned-char -
Пусть тип
charбудет знаковым, какsigned char.Обратите внимание, что это эквивалентно -fno-unsigned-char, которое является отрицательной формой -funsigned-char. Аналогично, опция -fno-signed-char эквивалентна -funsigned-char.
-
-funsigned-char -
Пусть тип
charбудет беззнаковым, какunsigned char.Каждая машина имеет значение по умолчанию для того, что
charдолжно быть. Оно по умолчанию либо такое же, как уunsigned char, или такое же, как уsigned char.В идеале, портативная программа должна всегда использовать
signed charилиunsigned char, когда она зависит от знаковости объекта. Но многие программы были написаны для использования простогоchar, ожидая, что он будет знаковым или беззнаковым, в зависимости от машин, для которых они были написаны. Эта опция и ее обратная опция позволяют программе работать с противоположным значением по умолчанию.Тип
charвсегда является отдельным типом от каждого изsigned charилиunsigned char, хотя его поведение всегда похоже на одно из этих двух. -
-fstrict-flex-arrays -
Управление тем, когда массив в конце структуры следует рассматривать как гибкий элемент массива для доступа к элементам такого массива. Положительная форма эквивалентна -fstrict-flex-arrays=3, которая является самой строгой. Массив в конце структуры рассматривается как гибкий член массива только тогда, когда он объявлен как гибкий член массива в соответствии со стандартом C99 и далее. Отрицательная форма эквивалентна -fstrict-flex-arrays=0, которая является наименее строгой. Все массивы в конце структур рассматриваются как гибкие элементы массива.
-
-fstrict-flex-arrays=level -
Управление тем, когда массив в конце структуры следует рассматривать как гибкий элемент массива для доступа к элементам такого массива. Значение level управляет уровнем строгости.
Возможные значения level такие же, как для атрибута
strict_flex_array(см. Указание атрибутов переменных).Вы можете контролировать это поведение для конкретного поля массива в конце структуры, используя атрибут переменной
strict_flex_array(см. Указание атрибутов переменных). -
-fsso-struct=endianness -
Установите порядок хранения скаляров структур и объединений по умолчанию в указанную форму представления данных. Принимаемые значения — ‘big-endian’, ‘little-endian’ и ‘native’ для родной формы представления данных целевой системы (по умолчанию). Эта опция не поддерживается для C++.
Предупреждение: переключатель -fsso-struct заставляет GCC генерировать код, не совместимый с бинарным кодом, сгенерированным без него, если указанная форма представления данных не совпадает с родной формой представления данных целевой системы.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-13.3.0/gcc/C-Dialect-Options.html