Spec-Zone.ru › GCC 9

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. Версия с интегрированными исправлениями была подготовлена в 2017 году и опубликована в 2018 году как ISO/IEC 9899:2018; она известна как C17 и поддерживается с помощью -std=c17 или -std=iso9899:2017; исправления также применяются с -std=c11, и единственное различие между параметрами — значение __STDC_VERSION__.

Дальнейшая версия стандарта C, известная как C2X, находится в разработке; экспериментальная и неполная поддержка этой версии активируется с помощью -std=c2x.

По умолчанию 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 library). См. Стандартные библиотеки.

Большинство подпрограмм поддержки компилятора, используемых 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 позволит использовать некоторые нестандартные функции 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. Синтаксис кратко документирован в этом руководстве и в руководствах Apple по Objective-C 2.0.

Расширения и возможности языка 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/archive/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 Язык D

GCC поддерживает язык программирования D 2.0. Сам язык D в настоящее время определяется своей эталонной реализацией и поддерживающей языковой спецификацией, описанной на https://dlang.org/spec/spec.html.

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

См. Об этом руководстве в Справочном руководстве 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-9.5.0/gcc/Standards.html

Spec-Zone.ru

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