2 Стандарты языков, поддерживаемые GCC
Для каждого языка, компилируемого GCC, для которого существует стандарт, GCC пытается следовать одной или нескольким версиям этого стандарта, возможно, с некоторыми исключениями и, возможно, с некоторыми расширениями.
2.1 Язык C
GCC поддерживает три версии стандарта C, хотя поддержка последней версии пока неполная.
Оригинальный стандарт ANSI C (X3.159-1989) был ратифицирован в 1989 году и опубликован в 1990 году. Этот стандарт был ратифицирован как стандарт ISO (ISO/IEC 9899:1990) позднее в 1990 году. Не было технических различий между этими публикациями, хотя разделы стандарта ANSI были переименованы и стали главами в стандарте ISO. Этот стандарт, в обеих своих формах, обычно известен как C89, или иногда как C90, по датам ратификации. Стандарт ANSI, но не стандарт ISO, также поставлялся с документом Rationale. Для выбора этого стандарта в 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 для получения всех необходимых диагностических сообщений).
Новая редакция стандарта ISO C была опубликована в 1999 году как ISO/IEC 9899:1999 и обычно известна как C99. GCC имеет существенно полную поддержку этой версии стандарта; см. http://gcc.gnu.org/c99status.html для получения подробностей. Для выбора этого стандарта используйте -std=c99 или -std=iso9899:1999. (Во время разработки проекты этой версии стандарта обозначались как C9X.)
Ошибки в стандарте ISO C 1999 были исправлены в трех технических поправках, опубликованных в 2001, 2004 и 2007 годах. GCC не поддерживает неисправленную версию.
Четвертая версия стандарта C, известная как C11, была опубликована в 2011 году как ISO/IEC 9899:2011. GCC имеет существенно полную поддержку этого стандарта, активируемую с помощью -std=c11 или -std=iso9899:2011. (Во время разработки проекты этой версии стандарта обозначались как C1X.)
По умолчанию GCC предоставляет некоторые расширения языка C, которые в редких случаях конфликтуют со стандартом C. См. Расширения семейства языков C. Использование параметров -std в списке выше отключит эти расширения, где они конфликтуют с выбранной версией стандарта C. Вы также можете явно выбрать расширенную версию языка C с помощью -std=gnu90 (для C90 с расширениями GNU), -std=gnu99 (для C99 с расширениями GNU) или -std=gnu11 (для C11 с расширениями GNU). По умолчанию, если не указаны параметры диалекта языка C, используется -std=gnu90; ожидается, что это изменится на -std=gnu11 в некоторых будущих выпусках. Некоторые функции, которые являются частью стандарта C99, принимаются как расширения в режиме C90, и некоторые функции, которые являются частью стандарта C11, принимаются как расширения в режимах C90 и C99.
Стандарт 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 и не будет делать предположений о значениях имен функций из стандартной библиотеки, с исключениями, отмеченными ниже. Для построения ядра ОС, вам, вероятно, все равно придется самостоятельно организовать компоновку и запуск.
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) и содержит экспериментальную поддержку второго стандарта ISO C++ (2011).
Оригинальный стандарт 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++, большинство из которых реализовано в экспериментальном режиме C++11 в GCC. Для получения информации об имеющихся в экспериментальном режиме C++11 функциях C++11 см. http://gcc.gnu.org/projects/cxx0x.html. Для выбора этого стандарта в GCC используйте параметр -std=c++11; для получения всех диагностических сообщений, требуемых стандартом, вы также должны указать -pedantic (или -pedantic-errors если вы хотите, чтобы они были ошибками, а не предупреждениями).
Дополнительную информацию о стандартах C++ можно найти на веб-сайте комитета по стандартам ISO C++ по адресу http://www.open-std.org/jtc1/sc22/wg21/.
По умолчанию GCC предоставляет некоторые расширения языка C++; см. Параметры, управляющие диалектом C++. Использование параметра -std в списке выше отключит эти расширения. Вы также можете явно выбрать расширенную версию языка C++ с помощью -std=gnu++98 (для C++98 с расширениями GNU) или -std=gnu++11 (для C++11 с расширениями GNU). По умолчанию, если не указаны параметры диалекта языка C++, используется -std=gnu++98.
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 — тот же документ в другом формате;
- http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/ObjectiveC/ — обновленная версия, но убедитесь, что вы ищете «Объектно-ориентированное программирование и язык программирования Objective-C 1.0», а не документацию по более новому языку «Objective-C 2.0»
Синтаксис исключений и синхронизации Objective-C (т. е. ключевые слова @try, @throw, @catch, @finally и @synchronized) поддерживаются GCC и активируются с помощью параметра -fobjc-exceptions. Синтаксис кратко документирован в этом руководстве и в руководствах по Objective-C 2.0 от Apple.
Расширения и возможности языка Objective-C 2.0 включены автоматически; они включают свойства (через ключевые слова @property, @synthesize и @dynamic), быстрый перебор (недоступен в 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.
См. Совместимость с платформой Java для получения подробностей о совместимости между gcj и платформой Java.
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-4.9.4/gcc/Standards.html