Spec-Zone.ru › GCC 8

2 Стандарты языков, поддерживаемые GCC

Для каждого языка, компилируемого GCC, для которого существует стандарт, GCC пытается следовать одной или нескольким версиям этого стандарта, возможно, с некоторыми исключениями, а возможно, с некоторыми расширениями.

2.1 Язык C

Оригинальный стандарт ANSI C (X3.159-1989) был ратифицирован в 1989 году и опубликован в 1990 году. Этот стандарт был ратифицирован как стандарт ISO (ISO/IEC 9899:1990) несколько позднее в 1990 году. Между этими публикациями не было технических различий, хотя разделы стандарта ANSI были переименованы и стали параграфами в стандарте ISO. Стандарт ANSI, но не стандарт ISO, также поставлялся с документом Rationale. Этот стандарт, в обеих своих формах, обычно известен как C89 или иногда как C90, от дат ратификации. Чтобы выбрать этот стандарт в GCC, используйте один из вариантов -ansi, -std=c90 или -std=iso9899:1990; чтобы получить все диагностические сообщения, требуемые стандартом, вы также должны указать -pedantic (или -pedantic-errors, если вы хотите, чтобы они были ошибками, а не предупреждениями). См. Параметры, контролирующие диалект C.

Ошибки в стандарте ISO C 1990 были исправлены в двух технических исправлениях, опубликованных в 1994 и 1996 годах. GCC не поддерживает неисправленную версию.

В 1995 году был опубликован дополнение к стандарту 1990 года. Это дополнение добавило диграфы и __STDC_VERSION__ к языку, но в остальном касалось библиотеки. Это дополнение обычно известно как AMD1; изменённый стандарт иногда называют C94 или C95. Чтобы выбрать этот стандарт в GCC, используйте параметр -std=iso9899:199409 (с, как и для других версий стандарта, -pedantic для получения всех необходимых диагностических сообщений).

В 1999 году была опубликована новая редакция стандарта ISO C как ISO/IEC 9899:1999, обычно известная как C99. (Во время разработки проекты этой версии стандарта назывались C9X.) GCC имеет существенно полную поддержку этой версии стандарта; см. http://gcc.gnu.org/c99status.html для получения подробностей. Для выбора этого стандарта используйте -std=c99 или -std=iso9899:1999.

Ошибки в стандарте ISO C 1999 были исправлены в трёх технических исправлениях, опубликованных в 2001, 2004 и 2007 годах. GCC не поддерживает неисправленную версию.

Четвёртая версия стандарта C, известная как C11, была опубликована в 2011 году как ISO/IEC 9899:2011. (Во время разработки проекты этой версии стандарта назывались C1X.) GCC имеет существенно полную поддержку этого стандарта, включенную с -std=c11 или -std=iso9899:2011. Версия с интегрированными исправлениями известна как C17 и поддерживается с -std=c17 или -std=iso9899:2017; исправления также применяются с -std=c11, и единственное различие между параметрами заключается в значении __STDC_VERSION__.

По умолчанию GCC предоставляет некоторые расширения языка C, которые в редких случаях конфликтуют со стандартом C. См. Расширения семейства языков C. Некоторые функции, которые являются частью стандарта C99, принимаются как расширения в режиме C90, и некоторые функции, которые являются частью стандарта C11, принимаются как расширения в режимах C90 и C99. Использование параметров -std, перечисленных выше, отключает эти расширения, где они конфликтуют с выбранной версией стандарта C. Вы также можете явно выбрать расширенную версию языка C с помощью -std=gnu90 (для C90 с расширениями GNU), -std=gnu99 (для C99 с расширениями GNU) или -std=gnu11 (для C11 с расширениями GNU).

По умолчанию, если не указаны параметры диалекта языка C, используется -std=gnu11.

Стандарт ISO C определяет (в параграфе 4) два класса соответствующих реализаций. Соответствующая реализация размещённой системы поддерживает весь стандарт, включая все средства библиотеки; соответствующая реализация автономной системы обязана предоставлять только определённые средства библиотеки: те, которые находятся в <float.h>, <limits.h>, <stdarg.h>, и <stddef.h>; с момента AMD1, также те, которые находятся в <iso646.h>; с момента C99, также те, которые находятся в <stdbool.h> и <stdint.h>; и с момента C11, также те, которые находятся в <stdalign.h> и <stdnoreturn.h>. Кроме того, сложные типы, добавленные в C99, не требуются для автономных реализаций.

Стандарт также определяет две среды для программ, автономную среду, необходимую для всех реализаций, которая может не иметь средств библиотеки, за пределами необходимых средств автономных реализаций, где обработка запуска и завершения программы определяется реализацией; и среду размещённой системы, которая не требуется, в которой предоставляются все средства библиотеки, а запуск происходит через функцию int main (void) или int main (int, char *[]). Операционная система является примером программы, работающей в автономной среде; программа, использующая средства операционной системы, является примером программы, работающей в среде размещённой системы.

GCC стремится быть используемым как соответствующая реализация автономной системы или как компилятор соответствующей реализация размещённой системы. По умолчанию он действует как компилятор для реализация размещённой системы, определяя __STDC_HOSTED__ как 1 и предполагая, что при использовании имён функций ISO C, они имеют семантику, определённую в стандарте. Чтобы заставить его действовать как соответствующую автономную реализацию для автономной среды, используйте параметр -ffreestanding; тогда он определяет __STDC_HOSTED__ как 0 и не делает предположений о значениях имён функций из стандартной библиотеки, за исключением указанных ниже случаев. Для создания ядра ОС вам, вероятно, всё равно придётся позаботиться о компоновке и запуске. См. Параметры, контролирующие диалект C.

GCC не предоставляет средства библиотеки, необходимые только для реализаций размещённой системы, а также не все средства, необходимые для реализаций C99 автономной системы на всех платформах. Для использования средств среды размещённой системы вам нужно найти их где-то ещё (например, в библиотеке GNU C). См. Стандартные библиотеки.

Большинство поддерживающих компилятор процедур, используемых GCC, присутствуют в libgcc, но есть несколько исключений. GCC требует, чтобы автономная среда предоставляла memcpy, memmove, memset и memcmp. Наконец, если используется __builtin_trap, и целевая система не реализует шаблон trap, тогда GCC генерирует вызов abort.

Для ссылок на технические исправления, документы Rationale и информацию об истории C, доступную онлайн, см. http://gcc.gnu.org/readings.html

2.2 Язык C++

GCC поддерживает оригинальный стандарт ISO C++, опубликованный в 1998 году, и редакции 2011 и 2014 годов.

Оригинальный стандарт ISO C++ был опубликован как стандарт ISO (ISO/IEC 14882:1998) и дополнен техническим исправлением, опубликованным в 2003 году (ISO/IEC 14882:2003). Эти стандарты называются C++98 и C++03 соответственно. GCC реализует большинство функций C++98 (export — заметное исключение) и большинство изменений в C++03. Чтобы выбрать этот стандарт в GCC, используйте один из вариантов -ansi, -std=c++98 или -std=c++03; чтобы получить все диагностические сообщения, требуемые стандартом, вы также должны указать -pedantic (или -pedantic-errors, если вы хотите, чтобы они были ошибками, а не предупреждениями).

Пересмотренный стандарт ISO C++ был опубликован в 2011 году как ISO/IEC 14882:2011 и называется C++11; до его публикации он обычно назывался C++0x. C++11 содержит несколько изменений языка C++, все из которых реализованы в GCC. Для получения подробностей см. https://gcc.gnu.org/projects/cxx-status.html#cxx11. Чтобы выбрать этот стандарт в GCC, используйте параметр -std=c++11.

Другой пересмотренный стандарт ISO C++ был опубликован в 2014 году как ISO/IEC 14882:2014 и называется C++14; до его публикации его иногда называли C++1y. C++14 содержит несколько дальнейших изменений языка C++, все из которых реализованы в GCC. Для получения подробностей см. https://gcc.gnu.org/projects/cxx-status.html#cxx14. Чтобы выбрать этот стандарт в GCC, используйте параметр -std=c++14.

Язык C++ был дополнительно пересмотрен в 2017 году и опубликован ISO/IEC 14882:2017. Он называется C++17, а до публикации часто назывался C++1z. GCC поддерживает все изменения в новом стандарте. Для получения дополнительных сведений см. https://gcc.gnu.org/projects/cxx-status.html#cxx1z. Используйте параметр -std=c++17, чтобы выбрать этот вариант C++.

Дополнительную информацию о стандартах C++ можно найти на веб-сайте комитета по стандартам C++ ISO по адресу http://www.open-std.org/jtc1/sc22/wg21/.

Чтобы получить все диагностические сообщения, требуемые любой из вышеописанных версий стандарта, вы должны указать -pedantic или -pedantic-errors, в противном случае GCC будет рассматривать некоторые не-ISO C++ функции как расширения. См. Параметры предупреждений.

По умолчанию GCC также предоставляет некоторые дополнительные расширения языка C++, которые в редких случаях конфликтуют со стандартом C++. См. Параметры, контролирующие диалект C++. Использование параметров -std, перечисленных выше, отключает эти расширения, где они конфликтуют с выбранной версией стандарта C++. Вы также можете явно выбрать расширенную версию языка C++ с -std=gnu++98 (для C++98 с расширениями GNU) или -std=gnu++11 (для C++11 с расширениями GNU), или -std=gnu++14 (для C++14 с расширениями GNU) или -std=gnu++17 (для C++17 с расширениями GNU).

По умолчанию, если не указаны параметры диалекта языка C++, используется -std=gnu++14.

2.3 Языки Objective-C и Objective-C++

GCC поддерживает «традиционный» Objective-C (также известный как «Objective-C 1.0») и содержит поддержку синтаксиса исключений и синхронизации Objective-C. Он также поддерживает ряд расширений языка «Objective-C 2.0», включая свойства, быструю итерацию (только для Objective-C), атрибуты методов и ключевые слова @optional и @required в протоколах. GCC поддерживает Objective-C++ и функции, доступные в Objective-C, также доступны в Objective-C++.

GCC по умолчанию использует библиотеку времени выполнения GNU Objective-C, которая является частью GCC и не идентична библиотеке времени выполнения Apple/NeXT Objective-C, используемой на системах Apple. В этом руководстве описаны ряд различий. Опции -fgnu-runtime и -fnext-runtime позволяют переключаться между созданием выходных данных, совместимых с библиотекой времени выполнения GNU Objective-C, и выходных данных, совместимых с библиотекой времени выполнения Apple/NeXT Objective-C.

Для Objective-C или Objective-C++ нет формального письменного стандарта. Авторитетным руководством по традиционному Objective-C (1.0) является «Объектно-ориентированное программирование и язык Objective-C»: http://www.gnustep.org/resources/documentation/ObjectivCBook.pdf — это оригинальный документ NeXTstep.

Синтаксис исключений и синхронизации Objective-C (то есть ключевые слова @try, @throw, @catch, @finally и @synchronized) поддерживается GCC и активируется с помощью опции -fobjc-exceptions. Синтаксис кратко описан в данном руководстве и в руководствах по Objective-C 2.0 от Apple.

Расширения и функции языка Objective-C 2.0 автоматически включены; они включают свойства (через @property, @synthesize и @dynamic keywords), быструю перечисление (не доступную в Objective-C++), атрибуты для методов (такие как deprecated, noreturn, sentinel, format), атрибут unused для аргументов методов, ключевое слово @package для переменных экземпляра и ключевые слова @optional и @required в протоколах. Вы можете отключить все эти расширения языка Objective-C 2.0 с помощью опции -fobjc-std=objc1, что заставит компилятор распознавать тот же синтаксис языка Objective-C, что и GCC 4.0, и выдавать ошибку, если используется одна из новых функций.

В настоящее время GCC не поддерживает нехрупкие переменные экземпляра.

Авторитетное руководство по Objective-C 2.0 доступно от Apple:

  • https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/Introduction/Introduction.html

Дополнительную информацию об истории Objective-C, доступную онлайн, см. на странице http://gcc.gnu.org/readings.html

2.4 Язык Go

Начиная с выпуска GCC 4.7.1, GCC поддерживает стандарт языка Go 1, описанный по адресу https://golang.org/doc/go1.

2.5 Промежуточный язык HSA (HSAIL)

GCC может компилировать двоичное представление (BRIG) текстового формата HSAIL, как описано в Руководстве программиста HSA версии 1.0.1. Эта возможность обычно используется для реализации расширения завершения HSAIL API времени выполнения HSA для процессора, поддерживаемого gcc. Стандарты HSA свободно доступны по адресу http://www.hsafoundation.com/standards/.

2.6 Справочные материалы по другим языкам

См. Об этом руководстве в Руководстве по GNAT для получения информации о соответствии стандартам и совместимости компилятора Ada.

См. Стандарты в Руководстве по компилятору GNU Fortran для получения подробной информации о поддерживаемых стандартах GNU Fortran.

Далее: Вызов GCC, Предыдущее: G++ и GCC, Вверх: В начало [Содержание][Индекс]

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-8.5.0/gcc/Standards.html

Spec-Zone.ru

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