Spec-Zone.ru › GCC 11

Next: Параметры, управляющие диалектом C++, Previous: Компиляция программ C++, Up: Параметры командной строки GCC [Содержание][Индекс]

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). Дополнительную информацию см. в http://gcc.gnu.org/c99status.html.

‘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. Поддержка сильно экспериментальная и почти наверняка изменится несовместимым образом в будущих выпусках.

-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.

-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», соответственно).

-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))
-fgimple

Включить разбор определений функций, помеченных __GIMPLE. Это экспериментальная функция, позволяющая проводить unit-тестирование пасов 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.6 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 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

Разрешать условные выражения с несовпадающими типами во втором и третьем аргументах. Значение такого выражения — 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++, Предыдущее: Компиляция C++ программ, Наверх: Команды GCC [Содержание][Индекс]

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-11.4.0/gcc/C-Dialect-Options.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API