ANSI C , ISO C и Standard C - это последовательные стандарты для языка программирования C, опубликованные Американским национальным институтом стандартов (ANSI) и Международной организацией по стандартизации (ISO). Исторически эти имена относились к исходной и наиболее поддерживаемой версии стандарта (известной как C89 или C90 ). Разработчикам программного обеспечения, пишущим на C, рекомендуется соответствовать стандартам, поскольку это способствует переносимости между компиляторами.
История и мировоззрение
Первый стандарт для C был опубликован ANSI. Хотя этот документ впоследствии был принят Международной организацией по стандартизации (ISO), а последующие версии, опубликованные ISO, были приняты ANSI, «ANSI C» по-прежнему используется для обозначения стандарта. [1] В то время как некоторые разработчики программного обеспечения используют термин ISO C, другие нейтральны в отношении стандартов и используют стандарт C.
Стандартизация C
В 1983 году Американский национальный институт стандартов сформировал комитет X3J11, чтобы установить стандартную спецификацию C. В 1985 году был выпущен первый проект стандарта, иногда называемый C85 . В 1986 году был выпущен еще один проект стандарта, иногда называемый C86 . Предварительный выпуск Standard C был опубликован в 1988 году и иногда упоминается как C88 . [2]
C89
Стандарт ANSI был завершен в 1989 году и ратифицирован как ANSI X3.159-1989 «Язык программирования C.» Эту версию языка часто называют «ANSI C». Позже иногда используется метка «C89», чтобы отличить его от C90, но с использованием того же метода маркировки.
C90
Тот же стандарт, что и C89, был ратифицирован Международной организацией по стандартизации как ISO / IEC 9899: 1990, с изменениями только форматирования [3], который иногда обозначается как C90. Следовательно, термины «C89» и «C90» относятся по существу к одному и тому же языку.
Этот стандарт был отменен как ANSI / INCITS [4], так и ISO / IEC. [5]
C95
В 1995 году ISO опубликовал расширение стандарта ANSI-C под названием Поправка 1. Его полное название было ISO / IEC 9899: 1990 / AMD1: 1995 или по прозвищу C95 . Помимо исправления ошибок, были внесены дополнительные изменения в языковые возможности [6] [7], такие как:
- Улучшение мульти-байт и широкий характер поддержки в стандартной библиотеке, введение
и
так же , как многобайтную ввода / вывода - Добавление диграфов к языку
- Спецификация стандартных макросов для альтернативной спецификации операторов, например,
and
для&&
- Спецификация стандартного макроса
__STDC_VERSION__
В дополнение к поправке, ISO опубликовала два технических исправления для C90:
- ISO / IEC 9899: 1990 / Cor 1: 1994 TCOR1 в 1994 г. [8]
- ISO / IEC 9899: 1990 / Cor 2: 1996 в 1996 г. [9]
Тест препроцессора на совместимость с C95
#if defined (__ STDC_VERSION__) && __STDC_VERSION__> = 199409L/ * Исходный код, совместимый с C95. * / #elif defined (__ STDC__) / * Исходный код, совместимый с C89. * / #endif
C99
В марте 2000 года ANSI принял стандарт ISO / IEC 9899: 1999 [10] . Этот стандарт обычно обозначается как C99. Некоторые заметные дополнения к предыдущему стандарту включают:
- Новые встроенные типы данных :
long long
,_Bool
,_Complex
, и_Imaginary
- Несколько новых функций основного языка, включая индексы статических массивов, назначенные инициализаторы, составные литералы, массивы переменной длины , гибкие элементы массива , макросы с переменным числом аргументов и
restrict
ключевое слово. - Несколько новые библиотечные заголовки, в том числе
stdint.h
,
,fenv.h
, - Улучшена совместимость с несколькими C ++ особенности, в том числе встроенных функций , однострочные комментарии с
//
, смесительные деклараций и кода, и универсальные имена символов в идентификаторах - Удалено несколько опасных функций языка C89, таких как неявные объявления функций и неявные
int
ISO опубликовал три технических исправления для C99:
- ISO / IEC 9899: 1999 / Cor 1: 2001 (E)
- ISO / IEC 9899: 1999 / Cor 2: 2004 (E)
- ISO / IEC 9899: 1999 / Cor 3: 2007 (E), примечателен протестующий стандартная библиотечная функция получает
Этот стандарт был отменен как ANSI / INCITS [11], так и ISO / IEC [12] в пользу C11.
C11
C11 был официально ратифицирован и опубликован 8 декабря 2011 года. Среди заметных особенностей - улучшенная поддержка Unicode , типовые выражения с использованием _Generic
ключевого слова new , кроссплатформенный многопоточный API ( threads.h
) и поддержка атомарных типов как в основном языке, так и в библиотеке ( stdatomic.h
).
Одно техническое исправление было опубликовано ISO для C11:
- ISO / IEC 9899: 2011 / Cor 1: 2012 [13]
C17
По состоянию на октябрь 2018 г.[Обновить], «C17» является текущим стандартом для языка программирования Си . [14]
C17 устраняет дефекты в C11 без введения новых языковых функций. [15]
C2x
C2x - неофициальное название следующей (после C17 ) основной версии стандарта языка C. [16] Ожидается, что голосование состоится не раньше 2021 года. [17]
В рамках процесса стандартизации ISO также публикует технические отчеты и спецификации, относящиеся к языку C:
- ISO / IEC TR 19769: 2004, [18] о расширениях библиотеки для поддержки форматов преобразования Unicode, интегрированных в C11
- ISO / IEC TR 24731-1: 2007, [19] о расширениях библиотеки для поддержки интерфейсов с проверкой границ, интегрированных в C11.
- ISO / IEC TR 18037: 2008, [20] о встроенных расширениях C
- ISO / IEC TR 24732: 2009, [21] о десятичной арифметике с плавающей запятой , замененный ISO / IEC TS 18661-2: 2015
- ISO / IEC TR 24747: 2009, [22] о специальных математических функциях,
- ISO / IEC TR 24731-2: 2010, [23] о расширениях библиотеки для поддержки функций динамического распределения.
- ISO / IEC TS 17961: 2013, [24] о безопасном кодировании на C
- ISO / IEC TS 18661-1: 2014, [25] на IEC 60559: 2011 -совместимая двоичная арифметика с плавающей запятой
- ISO / IEC TS 18661-2: 2015, [26] на IEC 60559: 2011-совместимая десятичная арифметика с плавающей запятой
- ISO / IEC TS 18661-3: 2015, [27] по обмену, совместимому с IEC 60559: 2011, и расширенным типам с плавающей запятой.
- ISO / IEC TS 18661-4: 2015, [28] о дополнительных функциях, совместимых с IEC 60559: 2011
Другие технические спецификации находятся в разработке и ожидают утверждения, включая пятую и последнюю часть TS 18661, спецификацию программной транзакционной памяти и расширения параллельных библиотек. [29]
Поддержка основных компиляторов
ANSI C теперь поддерживается почти всеми широко используемыми компиляторами. GCC и Clang - два основных компилятора C, популярных сегодня, оба основаны на C11 с обновлениями, включая изменения из более поздних спецификаций, таких как C17 и C18. [30] [31] Любой исходный код, написанный только на стандартном C и без каких-либо предположений, зависящих от оборудования, практически гарантированно правильно компилируется на любой платформе с соответствующей реализацией C. Без таких мер предосторожности большинство программ может компилироваться только на определенной платформе или с определенным компилятором, например, из-за использования нестандартных библиотек, таких как библиотеки графического интерфейса , или из-за зависимости от атрибутов, зависящих от компилятора или платформы. например, точный размер определенных типов данных и порядок байтов .
Обнаруживаемость соответствия
Чтобы уменьшить различия между K&R C и стандартом ANSI C, __STDC__
можно использовать макрос ("standard c") для разделения кода на разделы ANSI и K&R.
# если определено (__ STDC__) && __STDC__ extern int getopt ( int , char * const * , const char * ); #else extern int getopt (); #endif
В приведенном выше примере прототип используется в объявлении функции для ANSI-совместимых реализаций, в то время как устаревшее объявление не-прототипа используется в противном случае. Начиная с C99, они по-прежнему соответствуют требованиям ANSI. Обратите внимание, как этот код проверяет и определение, и оценку: это связано с тем, что некоторые реализации могут быть установлены __STDC__
в ноль, чтобы указать на несовместимость с ANSI. [32]
Компиляторы, поддерживающие ANSI C
- Комплект компилятора Amsterdam (C K&R и C89 / 90)
- ARM RealView
- Clang , используя бэкэнд LLVM
- GCC (полный C89 / 90, C99 и C11)
- Компилятор HP C / ANSI C (C89 и C99) [33]
- IBM XL C / C ++ (C11, начиная с версии 12.1) [34]
- Intel ICC
- LabWindows / CVI
- LCC
- OpenWatcom (C89 / 90 и некоторые C99)
- Microsoft Visual C ++ (C89 / 90 и немного C99)
- Pelles C (только C99 и C11. Windows) [35]
- vbcc (C89 / 90 и C99)
- Компилятор Tiny C (C89 / 90 и немного C99)
- Oracle Developer Studio
Смотрите также
- Язык описания поведения
- Совместимость C и C ++
- C ++ 17 , C ++ 14 , C ++ 11 , C ++ 03 , C ++ 98 , версии стандарта языка программирования C ++
- Технический отчет C ++ 1
Рекомендации
- ^ Брэд Келечава (2017-09-14). «Происхождение ANSI C и ISO C» . Проверено 14 августа 2018 .
- ^ Ричард Хейл Шоу (сентябрь 1988 г.). «Стандарт C: набирает популярность проект ANSI». Журнал ПК . Vol. 7 нет. 15. С. 116–117.
- ^ «Стандарты - Использование коллекции компиляторов GNU (GCC)» . Проверено 24 июня 2012 .
- ^ «INCITS / ISO / IEC 9899» . www.techstreet.com . Проверено 3 октября 2018 .
- ^ «ISO / IEC 9899: 1990 - Языки программирования - C» . Проверено 24 июня 2012 .
- ^ Клайв Д.У. Фезер (12 сентября 2010 г.). «Краткое описание нормативного дополнения 1» .
- ^ «ISO / IEC 9899: 1990 / Amd 1: 1995» . Международная Организация Стандартизации. 2013-03-22.
- ^ «ISO / IEC 9899: 1990 / Cor 1: 1994» . ISO . Проверено 21 января 2019 .
- ^ «ISO / IEC 9899: 1990 / Cor 2: 1996» . ISO . Проверено 21 января 2019 .
- ^ 14: 00-17: 00. «ISO / IEC 9899: 1999» . ISO . Проверено 21 января 2019 .CS1 maint: числовые имена: список авторов ( ссылка )
- ^ «INCITS / ISO / IEC 9899-2012» . ANSI.
- ^ «ISO / IEC 9899: 1999 - Языки программирования - C» . Проверено 24 июня 2012 .
- ^ «ISO / IEC 9899: 2011 / Cor 1: 2012» . Международная Организация Стандартизации.
- ^ «ISO / IEC 9899: 2018 - Информационные технологии - Языки программирования - C» . www.iso.org .
- ^ «Стандарт - С» . www.iso-9899.info .
- ^ «История C» . cppreference .
- ^ Майкл Ларабель (2018-10-18). «Компилятор GCC 9 добавляет -std = c2x и -std = gnu2x для будущего обновления языка C» .
- ^ «ISO / IEC TR 19769: 2004» . Международная Организация Стандартизации.
- ^ «ISO / IEC TR 24731-1: 2007» . Международная Организация Стандартизации.
- ^ «ISO / IEC TR 18037: 2008» . Международная Организация Стандартизации.
- ^ «ISO / IEC TR 24732: 2009» . Международная Организация Стандартизации.
- ^ «ISO / IEC TR 24747: 2009» . Международная Организация Стандартизации.
- ^ «ISO / IEC TR 24731-2: 2010» . Международная Организация Стандартизации.
- ^ «ISO / IEC TS 17961: 2013» . Международная Организация Стандартизации.
- ^ «ISO / IEC TS 18661-1: 2014» . Международная Организация Стандартизации.
- ^ «ISO / IEC TS 18661-2: 2015» . Международная Организация Стандартизации.
- ^ «ISO / IEC TS 18661-3: 2015» . Международная Организация Стандартизации.
- ^ «ISO / IEC TS 18661-4: 2015» . Международная Организация Стандартизации.
- ^ См. Список на https://en.cppreference.com/w/c/experimental. Посещено 16 января 2016 г.
- ^ «Использование коллекции компиляторов GNU (GCC): стандарты» . gcc.gnu.org . Проверено 5 февраля 2019 .
- ^ «Языковая совместимость» . clang.llvm.org . Проверено 5 февраля 2019 .
- ^ «Стандартные предопределенные имена макросов» . www.ibm.com . Проверено 10 апреля 2019 .
- ^ «Комплект разработчика HP C / ANSI C» . Проверено 12 июля 2015 .
- ^ Поддержка ISO C11 добавлена в компиляторы IBM XL C / C ++
- ^ ссылка на страницы Pelles C
дальнейшее чтение
- Шрайнер, Аксель-Тобиас (1993). Объектно-ориентированное программирование с ANSI-C . Hanser. ISBN 3-446-17426-5.
Внешние ссылки
- Рабочая группа ISO C
- Проект стандарта ANSI C (ANSI X3J11 / 88-090) (13 мая 1988 г.), третье общественное рассмотрение
- Проект обоснования ANSI C (ANSI X3J11 / 88-151) (18 ноября 1988 г.)
- C Информационный бюллетень № 1 (ANSI X3J11 / 93-007) (27 мая 1992 г.)
- Грамматика ANSI C Yacc
- Грамматика ANSI C, спецификация Lex
- «Языки программирования ISO / IEC 9899: 1999 - C» . Американский национальный институт стандартов. Архивировано из оригинала на 2011-07-25 . Проверено 6 августа 2009 .
- "Действие по стандартам ANSI, том 36, № 48" (PDF) . Американский национальный институт стандартов. 2005-12-02. Архивировано из оригинального (PDF) 04 марта 2016 года . Проверено 6 августа 2009 .