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 года ( книга Брайана Кернигана и Денниса Ритчи «Язык программирования Си» ).
В 1983 году Американский национальный институт стандартов сформировал комитет X3J11 для установления стандартной спецификации C. В 1985 году был выпущен первый проект стандарта, иногда называемый C85 . В 1986 году был выпущен еще один проект стандарта, иногда называемый C86 . Предварительный выпуск стандарта C был опубликован в 1988 году и иногда называемый C88 . [2]
Стандарт ANSI был завершен в 1989 году и ратифицирован как ANSI X3.159-1989 "Язык программирования C". Эту версию языка часто называют "ANSI C". Позже иногда используется обозначение "C89", чтобы отличить его от C90, но с использованием того же метода маркировки.
Тот же стандарт, что и C89, был ратифицирован ISO/IEC как ISO/IEC 9899:1990, с изменениями только в форматировании, [3] который иногда называют C90. Поэтому термины «C89» и «C90» относятся к языку, который практически идентичен.
Этот стандарт был отозван как ANSI/INCITS [4] , так и ISO/IEC. [5]
В 1995 году ISO / IEC опубликовали расширение, названное Поправкой 1, для стандарта C. Его полное название в конечном итоге было ISO/IEC 9899:1990/AMD1:1995 или прозвище C95 . Помимо исправления ошибок, были внесены дальнейшие изменения в возможности языка, [6] [7], такие как:
<wchar.h>
и многобайтового<wctype.h>
ввода -вывода and
для&&
__STDC_VERSION__
В дополнение к поправке ISO опубликовала два технических исправления для C90:
#если определено(__STDC_VERSION__) && __STDC_VERSION__ >= 199409L/* Исходный код, совместимый с C95. */ #elif defined(__STDC__) /* Исходный код, совместимый с C89. */ #endif
В марте 2000 года ANSI принял стандарт ISO/IEC 9899:1999. [10] Этот стандарт обычно называют C99. Некоторые примечательные дополнения к предыдущему стандарту включают:
long long
, _Bool
, _Complex
, и_Imaginary
restrict
ключевые словаstdint.h
, <tgmath.h>
, fenv.h
,<complex.h>
//
, смешивание объявлений и кода, а также универсальные имена символов в идентификаторах.int
ISO опубликовала три технических исправления для C99:
Этот стандарт был отменен как ANSI/INCITS [11] , так и ISO/IEC [12] в пользу C11.
C11 был официально ратифицирован и опубликован 8 декабря 2011 года. Среди примечательных особенностей — улучшенная поддержка Unicode , выражения с общим типом, использующие новое _Generic
ключевое слово, кроссплатформенный многопоточный API ( threads.h
) и поддержка атомарных типов как в основном языке, так и в библиотеке ( stdatomic.h
).
ISO опубликовала одно техническое исправление для C11:
По состоянию на октябрь 2018 года [обновлять]«C17» является текущим стандартом для языка программирования C. [ 14]
C17 устраняет дефекты C11 без введения новых языковых функций. [15]
C23 — неофициальное название следующей крупной редакции стандарта языка C. [16]
В рамках процесса стандартизации 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: