АНСИ С
Версии языка C |
---|
ANSI C , ISO C и Standard C — это последовательные стандарты языка программирования C, опубликованные Американским национальным институтом стандартов (ANSI) и ISO/IEC JTC 1/SC 22 /WG 14 Международной организации по стандартизации (ISO) и Международной организации по стандартизации (ISO). Международная электротехническая комиссия (МЭК). Исторически сложилось так, что названия относились конкретно к исходной и наиболее поддерживаемой версии стандарта (известной как C89 или C90 ). Разработчикам программного обеспечения, пишущим на C, рекомендуется соблюдать стандарты, поскольку это способствует переносимости между компиляторами.
История и мировоззрение
[ редактировать ]Первый стандарт C был опубликован ANSI. Хотя этот документ впоследствии был принят ISO/IEC, а последующие версии, опубликованные ISO/IEC, были приняты ANSI, «ANSI C» по-прежнему используется для обозначения стандарта. [1] В то время как некоторые разработчики программного обеспечения используют термин ISO C, другие нейтральны к стандартизации и используют стандарт C.
Неофициальная спецификация: K&R C ( C78 )
[ редактировать ]Неформальная спецификация 1978 года ( Брайана Кернигана и Денниса Ритчи книга «Язык программирования C» ).
Стандартизация C
[ редактировать ]В 1983 году Американский национальный институт стандартов сформировал комитет X3J11 для установления стандартной спецификации C. В 1985 году был выпущен первый проект стандарта, иногда называемый C85 . В 1986 году был выпущен еще один проект стандарта, иногда называемый C86 . Предварительная версия Standard C была опубликована в 1988 году и иногда называлась C88 . [2]
С89
[ редактировать ]Стандарт ANSI был разработан в 1989 году и ратифицирован как ANSI X3.159-1989 «Язык программирования C». Эту версию языка часто называют «ANSI C». Позже иногда используется метка «C89», чтобы отличить его от C90, но с использованием того же метода маркировки.
С90
[ редактировать ]Тот же стандарт, что и C89, был ратифицирован ISO/IEC как ISO/IEC 9899:1990, с изменениями только форматирования. [3] который иногда называют C90. Таким образом, термины «C89» и «C90» относятся к языку, который практически идентичен.
Этот стандарт был отменен как ANSI/INCITS [4] и ИСО/МЭК. [5]
С95
[ редактировать ]В 1995 году ISO / IEC опубликовал расширение стандарта C под названием «Поправка 1». В конечном итоге его полное название стало ISO/IEC 9899:1990/AMD1:1995 или по прозвищу C95 . Помимо исправления ошибок, в возможности языка были внесены дальнейшие изменения. [6] [7] такой как:
- Улучшена поддержка многобайтовых и широких символов в стандартной библиотеке.
<wchar.h>
и<wctype.h>
а также многобайтовый ввод-вывод - Добавление орграфов в язык
- Спецификация стандартных макросов для альтернативной спецификации операторов, например
and
для&&
- Спецификация стандартного макроса
__STDC_VERSION__
В дополнение к поправке ISO опубликовала два технических исправления для C90:
Тест препроцессора на совместимость с C95
[ редактировать ]#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199409L
/* C95 compatible source code. */
#elif defined(__STDC__)
/* C89 compatible source code. */
#endif
С99
[ редактировать ]В марте 2000 года ANSI принял стандарт ISO/IEC 9899:1999. [10] Этот стандарт обычно обозначается как C99. Некоторые заметные дополнения к предыдущему стандарту включают в себя:
- Новые встроенные типы данных :
long long
,_Bool
,_Complex
, и_Imaginary
- Несколько новых основных функций языка, включая индексы статических массивов, назначенные инициализаторы, составные литералы, массивы переменной длины , гибкие члены массива , макросы с переменным числом аргументов и
restrict
ключевое слово - Несколько новых заголовков библиотеки, в том числе
stdint.h
,<tgmath.h>
,fenv.h
,<complex.h>
- Улучшена совместимость с некоторыми функциями C++ , включая встроенные функции , однострочные комментарии с
//
, смешивая объявления и код, а также универсальные имена символов в идентификаторах - Удалены несколько опасных функций языка C89, таких как неявные объявления функций и неявные
int
ISO для C99 опубликовало три технических исправления:
- ИСО/МЭК 9899:1999/Кор 1:2001(Е)
- ИСО/МЭК 9899:1999/Кор 2:2004(Е)
- ISO/IEC 9899:1999/Cor 3:2007(E), отличающийся отказом от стандартной библиотечной функции, получает
Этот стандарт был отменен как ANSI/INCITS [11] и ИСО/МЭК [12] в пользу С11.
С11
[ редактировать ]C11 был официально ратифицирован и опубликован 8 декабря 2011 года. Примечательные особенности включают улучшенную поддержку Unicode , выражения общего типа с использованием нового _Generic
ключевое слово, кросс-платформенный многопоточный API ( threads.h
), а атомарные типы поддерживаются как в основном языке, так и в библиотеке ( stdatomic.h
).
ISO опубликовало одно техническое исправление для C11:
- ИСО/МЭК 9899:2011/Кор 1:2012 [13]
С17
[ редактировать ]По состоянию на октябрь 2018 г. [update], «C17» — текущий стандарт языка программирования C. [14]
C17 устраняет дефекты C11 без введения новых функций языка. [15]
С23
[ редактировать ]C23 — неофициальное название следующей основной языка C. версии стандарта [16]
Другие публикации ISO по теме
[ редактировать ]В рамках процесса стандартизации ISO/IEC также публикует технические отчеты и спецификации, относящиеся к языку C:
- ИСО/МЭК ТР 19769:2004, [17] о расширениях библиотеки для поддержки форматов преобразования Unicode, интегрированных в C11
- ИСО/МЭК ТР 24731-1:2007, [18] о расширениях библиотеки для поддержки интерфейсов с проверкой границ, интегрированных в C11
- ИСО/МЭК ТР 18037:2008, [19] о встроенных расширениях C
- ИСО/МЭК ТР 24732:2009, [20] по десятичной арифметике с плавающей запятой, заменено ISO/IEC TS 18661-2:2015
- ИСО/МЭК ТР 24747:2009, [21] о специальных математических функциях,
- ИСО/МЭК ТР 24731-2:2010, [22] о расширениях библиотеки для поддержки функций динамического выделения
- ИСО/МЭК ТС 17961:2013, [23] по безопасному кодированию на C
- ИСО/МЭК ТС 18661-1:2014, [24] по IEC 60559:2011 - совместимая двоичная арифметика с плавающей запятой
- ИСО/МЭК ТС 18661-2:2015, [25] с плавающей запятой , совместимой со стандартом IEC 60559:2011 на десятичной арифметике
- ИСО/МЭК ТС 18661-3:2015, [26] на обмене, совместимом с IEC 60559:2011, и расширенных типах с плавающей запятой
- ИСО/МЭК ТС 18661-4:2015, [27] дополнительные функции, совместимые с IEC 60559:2011
Другие технические спецификации находятся в стадии разработки и ожидают утверждения, включая пятую и последнюю часть TS 18661, спецификацию программной транзакционной памяти и расширения параллельной библиотеки. [28]
Поддержка со стороны основных компиляторов
[ редактировать ]ANSI C сейчас поддерживается почти всеми широко используемыми компиляторами. GCC и Clang — два основных популярных сегодня компилятора C, оба основаны на C11 с обновлениями, включая изменения из более поздних спецификаций, таких как C17. [29] [30] Любой исходный код, написанный только на стандарте C и без каких-либо допущений, зависящих от оборудования, практически гарантированно будет корректно компилироваться на любой платформе с соответствующей реализацией C. Без таких мер предосторожности большинство программ могут компилироваться только на определенной платформе или с помощью определенного компилятора, например, из-за использования нестандартных библиотек, таких как библиотеки графического интерфейса , или из-за использования атрибутов, специфичных для компилятора или платформы. такие как точный размер определенных типов данных и порядок байтов .
Возможность обнаружения соответствия
[ редактировать ]Чтобы смягчить различия между K&R C и стандартом ANSI C, __STDC__
Макрос («стандартный c») можно использовать для разделения кода на разделы ANSI и K&R.
#if defined(__STDC__) && __STDC__
extern int getopt(int, char * const *, const char *);
#else
extern int getopt();
#endif
В приведенном выше примере прототип используется в объявлении функции для реализаций, совместимых с ANSI, тогда как в противном случае используется устаревшее объявление, не являющееся прототипом. Начиная с C99, они по-прежнему соответствуют ANSI. Обратите внимание, как этот код проверяет как определение, так и оценку: это связано с тем, что некоторые реализации могут устанавливать __STDC__
до нуля, что указывает на несоответствие ANSI. [31]
Поддержка компилятора
[ редактировать ]Список компиляторов, поддерживающих ANSI C:
- Acornsoft ANSI C (первая версия 1988 г., исправленная в 1989 г.)
- Амстердамский компилятор (C K&R и C89/90)
- ARM RealView
- Clang с использованием LLVM бэкэнда
- GCC (полный C89/90, C99 и C11)
- Компилятор HP C/ANSI C (C89 и C99) [32]
- IBM XL C/C++ (C11, начиная с версии 12.1) [33]
- ICC компании Intel
- ЛабораторияWindows/CVI
- ООО
- Студия разработчиков Oracle
- OpenWatcom (C89/90 и некоторые C99)
- Microsoft Visual C++ (C89/90 и некоторые C99)
- Pelles C (C99 и C11. Только для Windows.) [34]
- vbcc (C89/90 и C99)
- Компилятор Tiny C (C89/90 и некоторые C99)
См. также
[ редактировать ]- Язык описания поведения
- Совместимость C и C++
- C++23 , C++20 , C++17 , C++14 , C++11 , C++03 , C++98 , версии стандарта языка программирования C++.
- Технический отчет C++ 1
Ссылки
[ редактировать ]- ^ Брэд Келечава (14 сентября 2017 г.). «Происхождение ANSI C и ISO C» . Проверено 14 августа 2018 г.
- ^ Ричард Хейл Шоу (13 сентября 1988 г.). «Стандарт C: проект ANSI растет» . Журнал ПК . Том. 7, нет. 15. С. 116–117 . Проверено 15 ноября 2022 г.
- ^ «Стандарты — использование коллекции компиляторов GNU (GCC)» . Проверено 24 июня 2012 г.
- ^ «ИНЦИТС/ИСО/МЭК 9899» . www.techstreet.com . Проверено 3 октября 2018 г.
- ^ «ISO/IEC 9899:1990 – Языки программирования – C» . Проверено 24 июня 2012 г.
- ^ Клайв Д. У. Физер (12 сентября 2010 г.). «Краткая характеристика Нормативного приложения 1» .
- ^ «ИСО/МЭК 9899:1990/Поправка 1:1995» . Международная организация по стандартизации. 22 марта 2013 г.
- ^ «ИСО/МЭК 9899:1990/Кор 1:1994» . ИСО . Проверено 21 января 2019 г.
- ^ «ИСО/МЭК 9899:1990/Кор 2:1996» . ИСО . Проверено 21 января 2019 г.
- ^ «ИСО/МЭК 9899:1999» . ИСО . Проверено 21 января 2019 г.
- ^ «ИНЦИТС/ИСО/МЭК 9899-2012» . АНСИ.
- ^ «ISO/IEC 9899:1999 – Языки программирования – C» . Проверено 24 июня 2012 г.
- ^ «ИСО/МЭК 9899:2011/Кор 1:2012» . Международная организация по стандартизации.
- ^ «ISO/IEC 9899:2018 – Информационные технологии. Языки программирования – C» . www.iso.org .
- ^ «Стандарт-С» . www.iso-9899.info .
- ^ «История Си» . cppreference .
- ^ «ИСО/МЭК ТР 19769:2004» . Международная организация по стандартизации.
- ^ «ИСО/МЭК ТР 24731-1:2007» . Международная организация по стандартизации.
- ^ «ИСО/МЭК ТР 18037:2008» . Международная организация по стандартизации.
- ^ «ИСО/МЭК ТР 24732:2009» . Международная организация по стандартизации.
- ^ «ИСО/МЭК ТР 24747:2009» . Международная организация по стандартизации.
- ^ «ИСО/МЭК ТР 24731-2:2010» . Международная организация по стандартизации.
- ^ «ИСО/МЭК ТС 17961:2013» . Международная организация по стандартизации.
- ^ «ИСО/МЭК ТС 18661-1:2014» . Международная организация по стандартизации.
- ^ «ИСО/МЭК ТС 18661-2:2015» . Международная организация по стандартизации.
- ^ «ИСО/МЭК ТС 18661-3:2015» . Международная организация по стандартизации.
- ^ «ИСО/МЭК ТС 18661-4:2015» . Международная организация по стандартизации.
- ^ «Экспериментальные функции C» . cppreference.com . Проверено 16 января 2016 г. .
- ^ «2 языковых стандарта, поддерживаемых GCC — язык 2.1 C» . Использование коллекции компиляторов GNU (GCC) . GCC, Коллекция компиляторов GNU . Проверено 5 февраля 2019 г.
- ^ «Языковая совместимость» . Интерфейс семейства языков Clang C для LLVM . Проверено 5 февраля 2019 г.
- ^ «Стандартные предопределенные имена макросов» . www.ibm.com . Проверено 10 апреля 2019 г.
- ^ «Пакет разработчика HP C/ANSI C» . Проверено 12 июля 2015 г.
- ^ Поддержка ISO C11 добавлена в компиляторы IBM XL C/C++.
- ^ ссылка на страницы Пеллеса C
Дальнейшее чтение
[ редактировать ]- Шрайнер, Аксель-Тобиас (1993). Объектно-ориентированное программирование с использованием ANSI-C . Хансер. 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
- «ISO/IEC 9899:1999 Языки программирования — C» . Американский национальный институт стандартов. Архивировано из оригинала 25 июля 2011 г. Проверено 6 августа 2009 г.
- «Действие по стандартам ANSI, том 36, № 48» (PDF) . Американский национальный институт стандартов. 02 декабря 2005 г. Архивировано из оригинала (PDF) 4 марта 2016 г. Проверено 6 августа 2009 г.