stringtranslate.com

ANSI C

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

История и перспективы

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

Неофициальная спецификация 1978 года ( книга Брайана Кернигана и Денниса Ритчи «Язык программирования Си» ).

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

В 1983 году Американский национальный институт стандартов сформировал комитет X3J11 для установления стандартной спецификации C. В 1985 году был выпущен первый проект стандарта, иногда называемый C85 . В 1986 году был выпущен еще один проект стандарта, иногда называемый C86 . Предварительный выпуск стандарта 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] , так и ISO/IEC. [5]

С95

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

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

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

#если определено(__STDC_VERSION__) && __STDC_VERSION__ >= 199409L/* Исходный код, совместимый с C95. */ #elif defined(__STDC__) /* Исходный код, совместимый с C89. */ #endif

С99

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

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

Этот стандарт был отменен как ANSI/INCITS [11] , так и ISO/IEC [12] в пользу C11.

С11

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

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

С17

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

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

С23

C23 — неофициальное название следующей крупной редакции стандарта языка C. [16]

Другие соответствующие публикации ISO

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

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

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

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

Соответствие обнаруживаемости

Чтобы смягчить различия между стандартами K&R C и ANSI C, __STDC__можно использовать макрос («стандартный c») для разделения кода на разделы ANSI и K&R.

 #если определено(__STDC__) && __STDC__ extern int getopt ( int , char * const * , const char * ); #иначе extern int getopt (); #endif               

В приведенном выше примере прототип используется в объявлении функции для реализаций, соответствующих ANSI, в то время как устаревшее объявление не-прототипа используется в противном случае. Они все еще соответствуют ANSI по состоянию на C99. Обратите внимание, как этот код проверяет и определение, и оценку: это связано с тем, что некоторые реализации могут устанавливаться __STDC__в ноль, чтобы указать на несоответствие ANSI. [31]

Поддержка компилятора

Список компиляторов, поддерживающих ANSI C:

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

Ссылки

  1. ^ Брэд Келекхава (2017-09-14). "Происхождение ANSI C и ISO C" . Получено 2018-08-14 .
  2. Ричард Хейл Шоу (13 сентября 1988 г.). «Стандарт C: Проект ANSI растет». PC Magazine . Том 7, № 15. С. 116–117 . Получено 15 ноября 2022 г.
  3. ^ "Стандарты - Использование коллекции компиляторов GNU (GCC)" . Получено 2012-06-24 .
  4. ^ "INCITS/ISO/IEC 9899". www.techstreet.com . Получено 2018-10-03 .
  5. ^ "ISO/IEC 9899:1990 - Языки программирования -- C" . Получено 2012-06-24 .
  6. ^ Клайв Д. В. Фезер (12 сентября 2010 г.). «Краткое описание Нормативного дополнения 1».
  7. ^ "ISO/IEC 9899:1990/Amd 1:1995". Международная организация по стандартизации. 2013-03-22.
  8. ^ "ISO/IEC 9899:1990/Cor 1:1994". ISO . Получено 21.01.2019 .
  9. ^ "ISO/IEC 9899:1990/Cor 2:1996". ISO . Получено 21.01.2019 .
  10. ^ "ISO/IEC 9899:1999". ISO . Получено 2019-01-21 .
  11. ^ «INCITS/ISO/IEC 9899-2012». АНСИ.
  12. ^ "ISO/IEC 9899:1999 - Языки программирования -- C" . Получено 2012-06-24 .
  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. ^ "Экспериментальные возможности C". cppreference.com . Получено 16 января 2016 г. .
  29. ^ "2 языковых стандарта, поддерживаемых GCC - 2.1 Язык C". Использование коллекции компиляторов GNU (GCC) . GCC, коллекция компиляторов GNU . Получено 2019-02-05 .
  30. ^ "Совместимость языков". Фронтенд семейства языков Clang C для LLVM . Получено 2019-02-05 .
  31. ^ "Стандартные предопределенные имена макросов". www.ibm.com . Получено 2019-04-10 .
  32. ^ "HP C/ANSI C developer's bundle" . Получено 2015-07-12 .
  33. ^ Поддержка ISO C11 добавлена ​​в компиляторы IBM XL C/C++
  34. ^ ссылка на страницы Pelles C

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

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