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.
По умолчанию 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/cxx0x.html. Для выбора этого стандарта в GCC используйте опцию -std=c++11.
Другой пересмотренный стандарт ISO C++ был опубликован в 2014 году как ISO/IEC 14882:2014 и называется C++14; до его публикации его иногда называли C++1y. C++14 содержит несколько дополнительных изменений языка C++, все из которых реализованы в GCC. Подробности см. в https://gcc.gnu.org/projects/cxx1y.html. Для выбора этого стандарта в GCC используйте опцию -std=c++14.
GCC также поддерживает техническое задание по концепциям C++, ISO/IEC TS 19217:2015, которое позволяет определять ограничения для шаблонов, позволяя проверять аргументы шаблонов и перегружать или специализировать шаблоны на основе ограничений. Поддержка концепций C++ включена в экспериментальный режим C++1z, который соответствует следующему пересмотру стандарта ISO C++, ожидаемому к публикации в 2017 году. Для включения поддержки C++1z в GCC используйте опцию -std=c++17 или -std=c++1z.
Дополнительную информацию о стандартах 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++1z (для C++1z с расширениями 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;
- http://objc.toodarkpark.net — тот же документ в другом формате.
Синтаксис исключений и синхронизации 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:
Дополнительную информацию об истории Objective-C, доступную онлайн, см. на странице http://gcc.gnu.org/readings.html
2.4 Язык Go
Начиная с выпуска GCC 4.7.1, GCC поддерживает стандарт языка Go 1, описанный в http://golang.org/doc/go1.html.
2.5 Ссылки на другие языки
См. Об этом руководстве в Руководстве по GNAT для получения информации о соответствии стандартам и совместимости компилятора Ada.
См. Стандарты в Компиляторе GNU Fortran для получения подробной информации о поддерживаемых стандартах GNU Fortran.
См. Совместимость с платформой Java в GNU gcj для получения подробной информации о совместимости между gcj и платформой Java.
Далее: Вызов GCC, Предыдущее: G++ и GCC, Вверх: Верх [Содержание][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-6.5.0/gcc/Standards.html