ANSI C

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 21:43, 11 мая 2019.

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

История

Первый стандарт языка C был опубликован ANSI. Через некоторое время он был принят международной организацией по стандартизации ISO, продолжившей выпускать следующие версии стандарта, которые стали приниматься как стандарт и институтом ANSI. Несмотря на это стандарт до сих пор чаще называют ANSI C, а не ISO C.

C89

В 1983 году Американский национальный институт стандартов сформировал комитет X3J11 чтобы установить спецификации стандарта C. Стандарт был завершен в 1989 году и ратифицирован как ANSI X3.159-1989 «Язык программирования C.» Эта версия языка часто упоминается как «ANSI C», или «C89» (чтобы отличить её от C99).

C90

В 1990 году, стандарт ANSI C был принят Международной организацией по стандартизации (ISO) как ISO/IEC 9899:1990, с изменениями форматирования. Эту версию иногда называют C90. Однако, термины C89 и C90 относятся в сущности к одному языку.

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

C95

В 1995 году ISO (International Organization for Standardization) опубликовала расширение, названное Поправкой 1, для стандарта ANSI-C. Его полное имя было ISO / IEC 9899 / AMD1: 1995 или коротко - C95. Помимо исправления ошибок были внесены изменения в языковые возможности, такие как:

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

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

  • ISO/IEC 9899 TCOR1 в 1995 году
  • ISO/IEC 9899 TCOR2 в 1996 году

Тест препроцессора для совместимости с C95

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

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

C99

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

  • Новые встроенные типы данных: long long, _Bool, _Complex, и _Imaginary
  • Несколько новых функций основного языка, включая индексы статического массива, назначенные инициализаторы, сложные литералы, массивы переменной длины, гибкие члены массива, переменные макросы и restrict ключевое cлово
  • Несколько новых заголовков библиотек, включая stdint.h, <tgmath.h>, fenv.h, <complex.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)

C11

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

Другие родственные ISO публикации

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

  • ISO/IEC TR 19769:2004,[1] on library extensions to support Unicode transformation formats, integrated into C11
  • ISO/IEC TR 24731-1:2007,[2] on library extensions to support bounds-checked interfaces, integrated into C11
  • ISO/IEC TR 18037:2008,[3] on embedded C extensions
  • ISO/IEC TR 24732:2009,[4] on decimal floating point arithmetic, superseded by ISO/IEC TS 18661-2:2015
  • ISO/IEC TR 24747:2009,[5] on special mathematical functions,
  • ISO/IEC TR 24731-2:2010,[6] on library extensions to support dynamic allocation functions
  • ISO/IEC TS 17961:2013,[7] on secure coding in C
  • ISO/IEC TS 18661-1:2014,[8] on IEC 60559:2011-compatible binary floating-point arithmetic
  • ISO/IEC TS 18661-2:2015,[9] on IEC 60559:2011-compatible decimal floating point arithmetic
  • ISO/IEC TS 18661-3:2015,[10] on IEC 60559:2011-compatible interchange and extended floating-point types
  • ISO/IEC TS 18661-4:2015,[11] on IEC 60559:2011-compatible supplementary functions

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

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

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

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

Чтобы смягчить различия между 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 C

Примечания

  1. "ISO/IEC TR 19769:2004". International Organization for Standardization. 
  2. "ISO/IEC TR 24731-1:2007". International Organization for Standardization. 
  3. "ISO/IEC TR 18037:2008". International Organization for Standardization. 
  4. "ISO/IEC TR 24732:2009". International Organization for Standardization. 
  5. "ISO/IEC TR 24747:2009". International Organization for Standardization. 
  6. "ISO/IEC TR 24731-2:2010". International Organization for Standardization. 
  7. "ISO/IEC TS 17961:2013". International Organization for Standardization. 
  8. "ISO/IEC TS 18661-1:2014". International Organization for Standardization. 
  9. "ISO/IEC TS 18661-2:2015". International Organization for Standardization. 
  10. "ISO/IEC TS 18661-3:2015". International Organization for Standardization. 
  11. "ISO/IEC TS 18661-4:2015". International Organization for Standardization. 
  12. See a list at http://en.cppreference.com/w/c/experimental Visited 16 January 2016.

Источники

ANSI C // Википедия. [2017—2017]. Дата обновления: 23.11.2017. URL: https://en.wikipedia.org/wiki/ANSI_C (дата обращения: 23.11.2017).