Spec-Zone.ru › GCC 10

Далее: Параметры, Управляющие Диалектом C++, Предыдущее: Компиляция Программ C++, Вверх: Команды 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 для получения дополнительной информации. Имена ‘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. Это значение по умолчанию для C++-кода. Имя ‘gnu++1y’ устарело.

‘c++17’
‘c++1z’

Стандарт ISO C++ 2017 года плюс поправки. Имя ‘c++1z’ устарело.

‘gnu++17’
‘gnu++1z’

GNU диалект -std=c++17. Имя ‘gnu++1z’ устарело.

‘c++20’
‘c++2a’

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

‘gnu++20’
‘gnu++2a’

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

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

-fgnu-tm

При указании параметра -fgnu-tm, компилятор генерирует код для варианта Linux спецификации текущей ABI Intel’s Transactional Memory (ревизия 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;
};

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

Обратите внимание, что этот параметр выключен для всех платформ, кроме платформ 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
END_OF_DOCUMENT_MARKER

Установите порядок хранения скалярных данных структур и объединений по умолчанию в указанный порядок следования байтов. Принимаемые значения: ‘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-10.5.0/gcc/C-Dialect-Options.html

Spec-Zone.ru

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