Spec-Zone.ru › GCC 11

Следующее: Параметры командной строки GCC, Предыдущее: Поддерживаемые языки программирования GCC, Вверх: Введение [Оглавление][Индекс]

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

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

  • Язык C
  • Язык C++
  • Языки Objective-C и Objective-C++
  • Язык Go
  • Промежуточный язык HSA (HSAIL)
  • Язык D
  • Ссылки для других языков

2.1 Язык C ¶

Исходный стандарт ANSI C (X3.159-1989) был ратифицирован в 1989 году и опубликован в 1990 году. Этот стандарт был ратифицирован как международный стандарт (ISO/IEC 9899:1990) позднее в 1990 году. Не было технических различий между этими публикациями, хотя разделы стандарта ANSI были переименованы и стали пунктами в международном стандарте. Стандарт ANSI, но не международный стандарт, также сопровождался документом 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=gnu17.

Стандарт 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, 2017 и в основном 2020 годов.

Оригинальный стандарт 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#cxx17. Используйте параметр -std=c++17 для выбора этой версии C++.

Ещё один пересмотренный стандарт ISO C++ был опубликован в 2020 году как ISO/IEC 14882:2020 и обозначается как C++20; до его публикации его иногда называли C++2a. GCC поддерживает большинство изменений в этом стандарте. Дополнительные сведения см. на странице https://gcc.gnu.org/projects/cxx-status.html#cxx20. Для выбора этого стандарта в GCC используйте параметр -std=c++20.

Дополнительную информацию о стандартах C++ можно найти на сайте комитета ISO по C++ по адресу 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), или -std=gnu++20 (для C++20 с расширениями GNU).

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

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, Предыдущее: Языки программирования, поддерживаемые GCC, Вернуться: Введение [Оглавление][Индекс]

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

Spec-Zone.ru

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