Spec-Zone.ru › GCC 7

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 для получения дополнительной информации. Имена ‘c9x’ и ‘iso9899:199x’ устарели.

‘c11’
‘c1x’
‘iso9899:2011’

ISO C11, пересмотр стандарта ISO C 2011. Этот стандарт в значительной степени полностью поддерживается, за исключением ошибок, проблем с плавающей запятой (в основном, но не полностью, связанных с необязательными функциями C11 из приложений F и G), и необязательных приложений K (интерфейсы проверки границ) и L (анализ). Название ‘c1x’ устарело.

‘gnu90’
‘gnu89’

Диалект GNU ISO C90 (включая некоторые функции C99).

‘gnu99’
‘gnu9x’

Диалект GNU ISO C99. Имя ‘gnu9x’ устарело.

‘gnu11’
‘gnu1x’

Диалект GNU ISO C11. Это значение по умолчанию для кода C. Имя ‘gnu1x’ устарело.

‘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++1z’

Следующий пересмотр стандарта ISO C++, предварительно запланированный на 2017 год. Поддержка очень экспериментальная и, скорее всего, изменится несовместимыми способами в будущих выпусках.

‘gnu++1z’

Диалект GNU -std=c++1z. Поддержка очень экспериментальная и, скорее всего, изменится несовместимыми способами в будущих выпусках.

-fgnu89-inline

Параметр -fgnu89-inline указывает GCC использовать традиционную семантику GNU для функций inline в режиме C99. См. Функция Inline - Быстро, как макрос. Использование этого параметра примерно эквивалентно добавлению атрибута функции 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’, соответственно, в следующем символе). В случае определений функций, список аргументов в стиле 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 Application Programming Interface v2.0 http://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 http://www.openmp.org/. Эта опция подразумевает -pthread, и поэтому поддерживается только на целевых платформах, которые поддерживают -pthread. -fopenmp подразумевает -fopenmp-simd.

-fopenmp-simd

Включить обработку директив OpenMP SIMD с #pragma omp в C/C++ и !$omp в Fortran. Другие директивы OpenMP игнорируются.

-fcilkplus

Включить использование расширений языка Cilk Plus для C/C++. При указании опции -fcilkplus включается использование расширений языка Cilk Plus для C/C++. Текущая реализация следует спецификации ABI версии 1.2. Это экспериментальная функция, которая реализована лишь частично, и её интерфейс может быть изменён в будущих версиях GCC по мере изменения официальной спецификации. В настоящее время реализованы все функции, кроме _Cilk_for.

-fgnu-tm

При указании опции -fgnu-tm компилятор генерирует код для варианта Linux текущей спецификации ABI транзакционной памяти Intel (Ревизия 1.1, 6 мая 2009 г.). Это экспериментальная функция, чьи интерфейсы могут измениться в будущих версиях GCC, по мере изменения официальной спецификации. Обратите внимание, что не все архитектуры поддерживают эту функцию.

Для получения дополнительной информации о поддержке транзакционной памяти в GCC, см. Библиотеку GNU Transactional Memory в GNU Transactional Memory Library.

Обратите внимание, что функция транзакционной памяти не поддерживается с исключениями, не связанными с вызовами (-fnon-call-exceptions).

-fms-extensions

Поддержка некоторых нестандартных конструкций, используемых в заголовках файлов Microsoft.

В коде C++ это позволяет именам членов структур быть похожими на предыдущие объявления типов.

typedef int UOW;
struct ABC {
  UOW UOW;
};

Некоторые случаи неопределенных полей в структурах и объединениях принимаются только с этой опцией. Подробности см. в Неименованные поля struct/union внутри struct/union.

Обратите внимание, что эта опция отключена для всех платформ, кроме x86, использующих ms-abi.

-fplan9-extensions

Поддержка некоторых нестандартных конструкций, используемых в коде Plan 9.

Это включает -fms-extensions, разрешает передачу указателей на структуры с анонимными полями функциям, ожидающим указателей на элементы типа поля, и разрешает обращение к анонимным полям, объявленным с использованием typedef. Подробности см. в Неименованные поля struct/union внутри struct/union. Это поддерживается только для 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-7.5.0/gcc/C-Dialect-Options.html

Spec-Zone.ru

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