ANSI C - ANSI C

ANSI C , ISO C и Standard C - это последовательные стандарты для языка программирования C, опубликованные Американским национальным институтом стандартов (ANSI) и Международной организацией по стандартизации (ISO). Исторически эти имена относились к исходной и наиболее поддерживаемой версии стандарта (известной как C89 или C90 ). Разработчикам программного обеспечения, пишущим на C, рекомендуется соответствовать стандартам, поскольку это способствует переносимости между компиляторами.

История и мировоззрение

Первый стандарт для C был опубликован ANSI. Хотя этот документ впоследствии был принят Международной организацией по стандартизации (ISO), а последующие версии, опубликованные ISO, были приняты ANSI, «ANSI C» по-прежнему используется для обозначения стандарта. В то время как некоторые разработчики программного обеспечения используют термин ISO C, другие нейтральны в отношении стандартов и используют стандарт C.

Стандартизация C

В 1983 году Американский национальный институт стандартов сформировал комитет X3J11, чтобы установить стандартную спецификацию C. В 1985 году был выпущен первый проект стандарта, иногда называемый C85 . В 1986 году был выпущен еще один проект стандарта, иногда называемый C86 . Предварительный выпуск Standard C был опубликован в 1988 году и иногда упоминается как C88 .

C89

Стандарт ANSI был завершен в 1989 году и ратифицирован как ANSI X3.159-1989 «Язык программирования C.» Эту версию языка часто называют «ANSI C». Позже иногда используется метка «C89», чтобы отличить его от C90, но с использованием того же метода маркировки.

C90

Тот же стандарт, что и C89, был ратифицирован Международной организацией по стандартизации как ISO / IEC 9899: 1990, с изменениями только форматирования, который иногда обозначается как C90. Следовательно, термины «C89» и «C90» относятся по существу к одному и тому же языку.

Этот стандарт был отменен как ANSI / INCITS, так и ISO / IEC.

C95

В 1995 году ISO опубликовал расширение стандарта ANSI-C под названием Поправка 1. Его полное название было ISO / IEC 9899: 1990 / AMD1: 1995 или по прозвищу C95 . Помимо исправления ошибок, были внесены дополнительные изменения в языковые возможности, такие как:

  • Улучшение мульти-байт и широкий характер поддержки в стандартной библиотеке, введение <wchar.h>и <wctype.h>так же , как многобайтную ввода / вывода
  • Добавление диграфов к языку
  • Спецификация стандартных макросов для альтернативной спецификации операторов, например, andдля&&
  • Спецификация стандартного макроса __STDC_VERSION__

В дополнение к поправке, ISO опубликовала два технических исправления для C90:

  • ISO / IEC 9899: 1990 / Cor 1: 1994 TCOR1 в 1994 г.
  • ISO / IEC 9899: 1990 / Cor 2: 1996 в 1996 г.

Тест препроцессора на совместимость с C95

#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199409L

/* C95 compatible source code. */
#elif defined(__STDC__)
/* C89 compatible source code. */
#endif

C99

В марте 2000 года ANSI принял стандарт ISO / IEC 9899: 1999. Этот стандарт обычно обозначается как C99. Некоторые заметные дополнения к предыдущему стандарту включают:

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, так и ISO / IEC в пользу C11.

C11

C11 был официально ратифицирован и опубликован 8 декабря 2011 года. Среди заметных особенностей - улучшенная поддержка Unicode , типовые выражения с использованием _Genericключевого слова new , кроссплатформенный многопоточный API ( threads.h) и поддержка атомарных типов как в основном языке, так и в библиотеке. ( stdatomic.h).

Одно техническое исправление было опубликовано ISO для C11:

  • ISO / IEC 9899: 2011 / Cor 1: 2012

C17

По состоянию на октябрь 2018 года, «C17» является текущим стандартом для языка программирования Си .

C17 устраняет дефекты в C11 без введения новых языковых функций.

C2x

C2x - неофициальное название следующей (после C17 ) основной версии стандарта языка C.

Другие связанные публикации ISO

В рамках процесса стандартизации ISO также публикует технические отчеты и спецификации, относящиеся к языку C:

  • ISO / IEC TR 19769: 2004, о расширениях библиотеки для поддержки форматов преобразования Unicode, интегрированных в C11
  • ISO / IEC TR 24731-1: 2007, о расширениях библиотеки для поддержки интерфейсов с проверкой границ, интегрированных в C11
  • ISO / IEC TR 18037: 2008, о встроенных расширениях C
  • ISO / IEC TR 24732: 2009, о десятичной арифметике с плавающей запятой , заменен ISO / IEC TS 18661-2: 2015
  • ISO / IEC TR 24747: 2009, по специальным математическим функциям,
  • ISO / IEC TR 24731-2: 2010, о расширениях библиотеки для поддержки функций динамического распределения.
  • ISO / IEC TS 17961: 2013, о безопасном кодировании на C
  • ISO / IEC TS 18661-1: 2014, совместимые с IEC 60559: 2011 двоичные арифметические операции с плавающей запятой
  • ISO / IEC TS 18661-2: 2015, по IEC 60559: 2011-совместимая десятичная арифметика с плавающей запятой
  • ISO / IEC TS 18661-3: 2015, об обмене, совместимом с IEC 60559: 2011, и расширенных типах с плавающей запятой
  • ISO / IEC TS 18661-4: 2015, о дополнительных функциях, совместимых с IEC 60559: 2011

Другие технические спецификации находятся в разработке и ожидают утверждения, включая пятую и последнюю часть TS 18661, спецификацию программной транзакционной памяти и расширения параллельных библиотек.

Поддержка основных компиляторов

ANSI C теперь поддерживается почти всеми широко используемыми компиляторами. GCC и Clang - два основных компилятора C, популярных сегодня, оба основаны на C11 с обновлениями, включая изменения из более поздних спецификаций, таких как C17 и C18. Любой исходный код, написанный только на стандартном C и без каких-либо предположений, зависящих от оборудования, практически гарантированно корректно компилируется на любой платформе с соответствующей реализацией C. Без таких мер предосторожности большинство программ может компилироваться только на определенной платформе или с определенным компилятором, например, из-за использования нестандартных библиотек, таких как библиотеки графического интерфейса , или из-за зависимости от атрибутов, зависящих от компилятора или платформы. например, точный размер определенных типов данных и порядок байтов .

Обнаруживаемость соответствия

Чтобы уменьшить различия между K&R C и стандартом ANSI C, __STDC__можно использовать макрос ("standard 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.

Компиляторы, поддерживающие ANSI C

Смотрите также

использованная литература

  1. ^ Брэд Келечава (2017-09-14). «Происхождение ANSI C и ISO C» . Проверено 14 августа 2018 .
  2. ^ Ричард Хейл Шоу (сентябрь 1988). «Стандарт C: набирает популярность проект ANSI». Журнал ПК . Vol. 7 нет. 15. С. 116–117.
  3. ^ «Стандарты - Использование коллекции компиляторов GNU (GCC)» . Проверено 24 июня 2012 .
  4. ^ «INCITS / ISO / IEC 9899» . www.techstreet.com . Проверено 3 октября 2018 .
  5. ^ «ISO / IEC 9899: 1990 - Языки программирования - C» . Проверено 24 июня 2012 .
  6. ^ Clive DW Перо (2010-09-12). «Краткое описание нормативного дополнения 1» .
  7. ^ "ISO / IEC 9899: 1990 / Amd 1: 1995" . Международная Организация Стандартизации. 2013-03-22.
  8. ^ "ISO / IEC 9899: 1990 / Cor 1: 1994" . ISO . Проверено 21 января 2019 .
  9. ^ "ISO / IEC 9899: 1990 / Cor 2: 1996" . ISO . Проверено 21 января 2019 .
  10. ^ 14: 00-17: 00. «ISO / IEC 9899: 1999» . ISO . Проверено 21 января 2019 .CS1 maint: числовые имена: список авторов ( ссылка )
  11. ^ «INCITS / ISO / IEC 9899-2012» . ANSI.
  12. ^ «ISO / IEC 9899: 1999 - Языки программирования - C» . Проверено 24 июня 2012 .
  13. ^ «ISO / IEC 9899: 2011 / Cor 1: 2012» . Международная Организация Стандартизации.
  14. ^ «ISO / IEC 9899: 2018 - Информационные технологии - Языки программирования - C» . www.iso.org .
  15. ^ "Стандарт - C" . www.iso-9899.info .
  16. ^ «История C» . cppreference .
  17. ^ "ISO / IEC TR 19769: 2004" . Международная Организация Стандартизации.
  18. ^ «ISO / IEC TR 24731-1: 2007» . Международная Организация Стандартизации.
  19. ^ «ISO / IEC TR 18037: 2008» . Международная Организация Стандартизации.
  20. ^ «ISO / IEC TR 24732: 2009» . Международная Организация Стандартизации.
  21. ^ «ISO / IEC TR 24747: 2009» . Международная Организация Стандартизации.
  22. ^ «ISO / IEC TR 24731-2: 2010» . Международная Организация Стандартизации.
  23. ^ «ISO / IEC TS 17961: 2013» . Международная Организация Стандартизации.
  24. ^ «ISO / IEC TS 18661-1: 2014» . Международная Организация Стандартизации.
  25. ^ «ISO / IEC TS 18661-2: 2015» . Международная Организация Стандартизации.
  26. ^ «ISO / IEC TS 18661-3: 2015» . Международная Организация Стандартизации.
  27. ^ «ISO / IEC TS 18661-4: 2015» . Международная Организация Стандартизации.
  28. ^ См. Список на https://en.cppreference.com/w/c/experimental. Посещено 16 января 2016 г.
  29. ^ «Использование коллекции компиляторов GNU (GCC): стандарты» . gcc.gnu.org . Проверено 5 февраля 2019 .
  30. ^ «Совместимость языков» . clang.llvm.org . Проверено 5 февраля 2019 .
  31. ^ «Стандартные предопределенные имена макросов» . www.ibm.com . Проверено 10 апреля 2019 .
  32. ^ "Комплект разработчика HP C / ANSI C" . Проверено 12 июля 2015 .
  33. ^ Поддержка ISO C11 добавлена ​​в компиляторы IBM XL C / C ++
  34. ^ ссылка на страницы Pelles C

дальнейшее чтение

  • Шрайнер, Аксель-Тобиас (1993). Объектно-ориентированное программирование с ANSI-C . Hanser. ISBN 3-446-17426-5.

внешние ссылки