Spec-Zone.ru › GCC 9

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

Spec-Zone.ru

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