2 Поддерживаемые GCC стандарты языков
Для каждого языка, компилируемого GCC и имеющего стандарт, GCC стремится следовать одной или нескольким версиям этого стандарта, возможно, с некоторыми исключениями и расширениями.
- Язык C
- Язык C++
- Языки Objective-C и Objective-C++
- Язык COBOL
- Язык Go
- Язык D
- Язык Modula-2
- Ссылки по другим языкам
2.1 Язык C
Первоначальный стандарт ANSI C (X3.159-1989) был утверждён в 1989 году и опубликован в 1990 году. Позднее, в 1990 году, этот стандарт был утверждён как стандарт ISO (ISO/IEC 9899:1990). Между этими публикациями не было технических различий, хотя разделы стандарта ANSI были перенумерованы и стали пунктами стандарта ISO. Стандарт ANSI, в отличие от стандарта ISO, также сопровождался документом с обоснованием. Этот стандарт в обеих редакциях широко известен как C89 или иногда как C90 — по годам утверждения. Чтобы выбрать этот стандарт в GCC, используйте один из параметров -ansi, -std=c90 или -std=iso9899:1990; чтобы получить все диагностики, требуемые стандартом, следует также указать -pedantic (или -pedantic-errors, если требуется выдавать ошибки вместо предупреждений). См. Параметры управления диалектом C.
Ошибки стандарта ISO C 1990 года были исправлены в двух технических поправках, опубликованных в 1994 и 1996 годах. GCC не поддерживает неисправленную версию.
В 1990 году была опубликована поправка к стандарту 1995 года. Она добавила в язык диграфы и __STDC_VERSION__, но в остальном касалась библиотеки. Эта поправка широко известна как AMD1; исправленный стандарт иногда называют C94 или C95. Чтобы выбрать этот стандарт в GCC, используйте параметр -std=iso9899:199409 (как и для других версий стандарта, укажите -pedantic, чтобы получать все требуемые диагностики).
Новое издание стандарта ISO C было опубликовано в 1999 году как ISO/IEC 9899:1999 и широко известно как C99. (В ходе разработки проекты этой версии стандарта назывались C9X.) GCC поддерживает эту версию стандарта практически в полном объёме; подробности см. на странице https://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, известная как C23, была опубликована в 2024 году как ISO/IEC 9899:2024. (В ходе разработки проекты этой версии стандарта назывались C2X.) Поддержку этого стандарта можно включить с помощью -std=c23 или -std=iso9899:2024.
В настоящее время разрабатывается следующая версия стандарта C, известная как C2Y; экспериментальную и неполную поддержку этой версии можно включить с помощью -std=c2y.
По умолчанию GCC предоставляет некоторые расширения языка C, которые в редких случаях конфликтуют со стандартом C. См. Расширения семейства языков C. Некоторые возможности, входящие в стандарт C99, принимаются как расширения в режиме C90, а некоторые возможности стандарта C11 — как расширения в режимах C90 и C99. Использование перечисленных выше параметров -std отключает эти расширения, если они конфликтуют с выбранной версией стандарта C. Можно также явно выбрать расширенную версию языка C с помощью -std=gnu90 (C90 с расширениями GNU), -std=gnu99 (C99 с расширениями GNU), -std=gnu11 (C11 с расширениями GNU), -std=gnu17 (C17 с расширениями GNU) или -std=gnu23 (C23 с расширениями GNU).
Если параметры диалекта языка C не заданы, по умолчанию используется -std=gnu23.
Стандарт 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 имеют семантику, определённую стандартом. Чтобы GCC действовал как соответствующая стандарту автономная реализация для автономной среды, используйте параметр -ffreestanding; в этом случае он определяет __STDC_HOSTED__ как 0 и не делает предположений о значении имён функций из стандартной библиотеки, за исключениями, отмеченными ниже. Для сборки ядра ОС, вероятно, всё равно потребуется самостоятельно организовать компоновку и запуск. См. Параметры управления диалектом C.
GCC не предоставляет библиотечные средства, обязательные только для размещённых реализаций, а также пока не предоставляет на всех платформах все средства, требуемые стандартом C99 от автономных реализаций. Чтобы использовать средства размещённой среды, их необходимо найти отдельно (например, в библиотеке GNU C). См. Стандартные библиотеки.
Большинство вспомогательных процедур компилятора, используемых GCC, содержится в libgcc, но есть несколько исключений. GCC требует, чтобы автономная среда предоставляла memcpy, memmove, memset и memcmp. В отличие от стандартов, регулирующих memcpy, GCC ожидает, что при точном совпадении источника и назначения операция будет выполнена корректно и не приведёт к неопределённому поведению. Наконец, если используется __builtin_trap, а целевая платформа не реализует шаблон trap, GCC генерирует вызов abort.
Ссылки на технические поправки, документы с обоснованиями и доступные в интернете сведения об истории языка C см. на странице https://gcc.gnu.org/readings.html
2.2 Язык C++
GCC поддерживает первоначальный стандарт ISO C++, опубликованный в 1998 году, а также редакции 2011, 2014, 2017 годов и в основном редакции 2020 и 2024 годов.
Первоначальный стандарт 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.
В 2017 году язык C++ был снова пересмотрен, и был опубликован стандарт ISO/IEC 14882:2017. Он обозначается как C++17, а до публикации его часто называли C++1z. GCC поддерживает все изменения этой спецификации. Дополнительные сведения см. на странице https://gcc.gnu.org/projects/cxx-status.html#cxx17. Чтобы выбрать эту версию C++, используйте параметр -std=c++17.
Ещё один пересмотренный стандарт 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.
Последний пересмотренный стандарт ISO C++ был опубликован в 2024 году как ISO/IEC 14882:2024 и обозначается как C++23; до публикации его иногда называли C++2b. GCC поддерживает большинство изменений новой спецификации. Дополнительные сведения см. на странице https://gcc.gnu.org/projects/cxx-status.html#cxx23. Чтобы выбрать этот стандарт в GCC, используйте параметр -std=c++23.
Дополнительные сведения о стандартах C++ доступны на сайте комитета ISO C++: https://www.open-std.org/jtc1/sc22/wg21/.
Чтобы получить все диагностики, требуемые любой из описанных выше версий стандарта, укажите -pedantic или -pedantic-errors; в противном случае GCC будет разрешать некоторые возможности C++, не входящие в стандарт ISO, в качестве расширений. См. Параметры управления предупреждениями.
По умолчанию 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) или -std=gnu++23 (C++23 с расширениями 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»: https://gnustep.github.io/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:
Дополнительные сведения об истории Objective-C, доступные в интернете, см. на странице https://gcc.gnu.org/readings.html
2.4 Язык COBOL
Начиная с выпуска GCC 15, GCC поддерживает стандарт языка ISO COBOL (ISO/IEC 1989:2023). Параметр -dialect обеспечивает некоторую совместимость с другими компиляторами COBOL.
2.5 Язык Go
Начиная с выпуска GCC 4.7.1, GCC поддерживает стандарт языка Go 1, описанный на странице https://go.dev/doc/go1.
2.6 Язык D
GCC поддерживает язык программирования D 2.0. Сам язык D в настоящее время определяется его эталонной реализацией и сопровождающей спецификацией языка, описанной на странице https://dlang.org/spec/spec.html.
2.7 Язык Modula-2
GCC поддерживает язык Modula-2 и соответствует диалектам PIM2, PIM3, PIM4 и ISO. Также реализован полный набор свободно распространяемых библиотек ISO. Кроме того, GCC включает набор библиотек PIM и некоторые библиотеки, совместимые с Logitech.
Дополнительные сведения о Modula-2 см. на странице https://gcc.gnu.org/readings.html. Руководство доступно в интернете по адресу https://gcc.gnu.org/onlinedocs/gm2/index.html.
2.8 Ссылки по другим языкам
Сведения о соответствии стандартам и совместимости компилятора Ada см. в разделе Об этом руководстве в справочном руководстве GNAT.
Подробные сведения о стандартах, поддерживаемых GNU Fortran, см. в разделе Стандарты руководства «Компилятор GNU Fortran».
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-15.3.0/gcc/Standards.html