Первый стандарт для C был опубликован ANSI. Хотя этот документ впоследствии был принят Международной организацией по стандартизации (ISO), а последующие версии, опубликованные ISO, были приняты ANSI, «ANSI C» по-прежнему используется для обозначения стандарта. В то время как некоторые разработчики программного обеспечения используют термин ISO C, другие нейтральны к стандарту и используют стандарт C.
C89
В 1983 году Американский национальный институт стандартов сформировал комитет X3J11, чтобы установить стандартная спецификация C. Стандарт был завершен в 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 опубликовал расширение, названное Поправка 1 к стандарту ANSI-C. Его полное название было ISO / IEC 9899: 1990 / AMD1: 1995 или прозвище C95. Помимо исправления ошибок, были внесены дополнительные изменения в языковые возможности, такие как:
В дополнение к поправке, 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 совместимый исходный код. * / #elif defined (__ STDC__) / * Исходный код, совместимый с C89. * / #endif
C99
В марте 2000 года ANSI приняла стандарт ISO / IEC 9899: 1999. Этот стандарт обычно называют C99. Некоторые заметные дополнения к предыдущему стандарту включают:
Новые встроенные типы данных : long long, _Bool, _Complex, и _Imaginary
Несколько новых заголовков библиотек, включая 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, так и ISO / IEC в пользу C11.
C11
C11 был официально ратифицирован и опубликован 8 декабря 2011 года. Среди заметных особенностей - улучшенная поддержка Unicode, типовые выражения с использованием нового _Generic, кроссплатформенный многопоточный API (threads.h) и атомарные типы поддерживаются как на основном языке, так и в библиотеке (stdatomic.h).
Одно техническое исправление было опубликовано ISO для C11:
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. Без таких мер предосторожности большинство программ может компилироваться только на определенной платформе или с определенным компилятором, например, из-за использования нестандартных библиотек, таких как библиотеки 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-совместимых реализаций, в то время как устаревшее объявление не-прототипа используется в противном случае. Они по-прежнему соответствуют требованиям ANSI, начиная с C99. Обратите внимание, как этот код проверяет как определение, так и оценку: это связано с тем, что некоторые реализации могут устанавливать __STDC__равным нулю, чтобы указать на несоответствие ANSI.