Spec-Zone.ru › GCC 5

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 стандарты языка.

Компилятор может принимать несколько базовых стандартов, таких как ‘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++.

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

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

‘gnu++1z’

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

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

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

Утверждает, что компиляция нацелена на гостевую среду. Это подразумевает -fbuiltin. Гостевая среда — это среда, в которой доступна вся стандартная библиотека, и в которой main имеет тип возвращаемого значения int. Примерами являются почти всё, кроме ядра. Это эквивалентно -fno-freestanding.

-ffreestanding

Утверждает, что компиляция нацелена на автономную среду. Это подразумевает -fno-builtin. Автономная среда — это среда, в которой стандартная библиотека может отсутствовать, и запуск программы может не обязательно происходить в main. Наиболее очевидным примером является ядро операционной системы. Это эквивалентно -fno-hosted.

См. Поддерживаемые стандарты языка GCC для получения подробностей об автономных и гостевых средах.

-fopenacc

Включить обработку директив OpenACC #pragma acc в C/C++ и !$acc в Fortran. При указании -fopenacc компилятор генерирует ускоренный код в соответствии с интерфейсом программирования приложений OpenACC v2.0 http://www.openacc.org/. Эта опция подразумевает -pthread, и поэтому поддерживается только на целевых платформах, поддерживающих -pthread.

Обратите внимание, что эта функция экспериментальная, неполная и может быть изменена в будущих версиях GCC. См. https://gcc.gnu.org/wiki/OpenACC для получения дополнительной информации.

-fopenmp

Включить обработку директив OpenMP #pragma omp в C/C++ и !$omp в Fortran. При указании -fopenmp компилятор генерирует параллельный код в соответствии с интерфейсом программирования приложений OpenMP v4.0 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.

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

-fms-extensions

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

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

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

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

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

-fplan9-extensions

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

Это включает -fms-extensions, позволяет передавать указатели на структуры с безымянными полями функциям, ожидающим указатели на элементы типа поля, и позволяет ссылаться на безымянные поля, объявленные с помощью typedef. Подробности см. в Безымянные поля struct/union в structs/unions. Это поддерживается только для C, а не для C++.

-trigraphs

Поддержка ISO C триграфов. Опция -ansi (и опции -std для строгого соответствия стандарту ISO C) подразумевает -trigraphs.

-traditional
-traditional-cpp

Ранее эти опции заставляли GCC пытаться эмулировать компилятор C до стандарта. Сейчас они поддерживаются только с переключателем -E. Препроцессор по-прежнему поддерживает режим до стандарта. Подробности см. в руководстве по GNU CPP.

-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, являются знаковыми типами.

Далее: Опции диалекта C++, Предыдущий: Вызов G++, Вверх: Вызов GCC [Оглавление][Индекс]

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

Spec-Zone.ru

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