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 стандарты языка. В настоящее время этот параметр поддерживается только при компиляции 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, редакция 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. Имя ‘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, за которым следуют их объявления, в комментариях после объявления.
-fallow-parameterless-variadic-functions-
Принимать функцию с переменным числом аргументов без именованных параметров.
Хотя определить такую функцию возможно, это не очень полезно, так как прочитать аргументы невозможно. Это поддерживается только для языка C, так как такая конструкция разрешена в C++.
-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. -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 Transactional Memory в GNU Transactional Memory Library.
Обратите внимание, что функция транзакционной памяти не поддерживается с исключениями, не относящимися к вызовам (-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. Примеры – практически всё, кроме ядра. Это эквивалентно -fno-freestanding. -flax-vector-conversions-
Разрешить неявные преобразования между векторами с различным количеством элементов и/или несовместимыми типами элементов. Эту опцию не следует использовать для нового кода.
-fms-extensions-
Принимать некоторые нестандартные конструкции, используемые в заголовочных файлах Microsoft.
В коде C++ это позволяет именам членов в структурах быть похожими на предыдущие объявления типов.
typedef int UOW; struct ABC { UOW UOW; };Некоторые случаи безымянных полей в структурах и объединениях принимаются только с этой опцией. Подробности см. в Безымянные поля структур/объединений в структурах/объединениях.
Обратите внимание, что эта опция выключена для всех целей, кроме целей x86, использующих ms-abi.
-foffload=disable-foffload=default-foffload=target-list-
Указать, для каких целей передачи данных OpenMP и OpenACC должен генерироваться код. Поведение по умолчанию, эквивалентное -foffload=default, генерирует код для всех поддерживаемых целей передачи данных. Форма -foffload=disable генерирует код только для отката хоста, а -foffload=target-list генерирует код только для указанного списка целей передачи данных, разделённых запятыми.
Цели передачи данных указываются в внутреннем формате целевого тройного имени GCC. Вы можете запустить компилятор с -v, чтобы увидеть список настроенных целей передачи данных в
OFFLOAD_TARGET_NAMES. -foffload-options=options-foffload-options=target-triplet-list=options-
С помощью -foffload-options=options, GCC передаёт указанные options компиляторам для всех включённых целей передачи данных. Вы можете указать опции, относящиеся только к определённой цели или целям, используя форму -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-
Указать стандартные размеры вычислений для областей параллельного перемещения, которые их явно не указывают. Значение 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 игнорируются. -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, даже если его поведение всегда аналогично одному из этих двух. -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-12.2.0/gcc/C-Dialect-Options.html