WikiDer > ANSI C
Эта статья нужны дополнительные цитаты для проверка. (Июль 2010 г.) (Узнайте, как и когда удалить этот шаблон сообщения) |
Редакции языка C |
---|
K&R C • ANSI C • C99 • C11 • C17 • C2x |
ANSI C, ISO C и Стандарт C являются последовательными стандартами для Язык программирования C опубликовано Американский национальный институт стандартов (ANSI) и Международная организация по стандартизации (ISO). Исторически эти имена относились к исходной и наиболее поддерживаемой версии стандарта (известной как C89 или же C90). Разработчикам программного обеспечения, пишущим на C, рекомендуется соответствовать стандартам, поскольку это помогает переносимость между компиляторами.
История и мировоззрение
Первый стандарт для C был опубликован ANSI. Хотя этот документ впоследствии был принят Международная организация по стандартизации (ISO) и последующие версии, опубликованные ISO, были приняты ANSI, «ANSI C» по-прежнему используется для обозначения стандарта.[1] В то время как некоторые разработчики программного обеспечения используют термин ISO C, другие нейтральны к органам стандартов и используют стандарт C.
C89
В 1983 году Американский национальный институт стандартов сформировал комитет X3J11, чтобы установить стандартную спецификацию C. Стандарт был завершен в 1989 году и ратифицирован как ANSI X3.159-1989 «Язык программирования C.» Эту версию языка часто называют «ANSI C». Позже иногда используется метка «C89», чтобы отличить его от C90, но с использованием того же метода маркировки.
C90
Тот же стандарт, что и C89, был ратифицирован Международной организацией по стандартизации как ISO / IEC 9899: 1990, с изменениями только форматирования,[2] который иногда называют C90. Следовательно, термины «C89» и «C90» относятся по существу к одному языку.
Этот стандарт был отменен ANSI / INCITS.[3] и ISO / IEC.[4]
C95
В 1995 г. ISO опубликовал расширение, называемое Поправкой 1, для стандарта ANSI-C. Его полное название наконец было ISO / IEC 9899: 1990 / AMD1: 1995 или по прозвищу C95. Помимо исправления ошибок, были внесены дополнительные изменения в языковые возможности,[5][6] Такие как:
- Улучшенный многобайтовый и широкий характер поддержка в стандартной библиотеке, введение
<wchar.h>
и<wctype.h>
а также многобайтовый Ввод / вывод - Добавление диграфы к языку
- Спецификация стандартных макросов для альтернативной спецификации операторов, например
и
за&&
- Спецификация стандартного макроса
__STDC_VERSION__
В дополнение к поправке, ISO опубликовала два технических исправления для C90:
- ISO / IEC 9899: 1990 / Cor 1: 1994 TCOR1 в 1994 г.[7]
- ISO / IEC 9899: 1990 / Cor 2: 1996 в 1996 г.[8]
Тест препроцессора на совместимость с C95
#if defined (__ STDC_VERSION__) && __STDC_VERSION__> = 199409L/ * Исходный код, совместимый с C95. * /#elif определено (__ STDC__)/ * Исходный код, совместимый с C89. * /#endif
C99
В марте 2000 года ANSI принял ISO / IEC 9899: 1999.[9] стандарт. Этот стандарт обычно называют C99. Некоторые заметные дополнения к предыдущему стандарту включают:
- Новый встроенный типы данных:
долго долго
,_Bool
,_Сложный
, и_Воображаемый
- Несколько новых функций основного языка, включая индексы статических массивов, назначенные инициализаторы, составные литералы, массивы переменной длины, гибкие элементы массива, вариационные макросы, и
ограничивать
ключевое слово - Несколько новых заголовков библиотек, в том числе
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), примечательный отказом от стандартной библиотечной функции получает
Этот стандарт был отменен ANSI / INCITS.[10] и ISO / IEC[11] в пользу C11.
C11
C11 был официально ратифицирован и опубликован 8 декабря 2011 года. Среди заметных особенностей - улучшенный Unicode поддержка, типовые выражения с использованием нового _Generic
ключевое слово, кроссплатформенный многопоточность API (threads.h
), и атомный поддержка типов как на основном языке, так и в библиотеке (stdatomic.h
).
Одно техническое исправление было опубликовано ISO для C11:
- ISO / IEC 9899: 2011 / Cor 1: 2012[12]
C17
По состоянию на октябрь 2018 г.[Обновить], «C17» - текущий стандарт для Язык программирования C.[13]
C17 устраняет дефекты в C11 без введения новых языковых функций.[14]
C2x
C2x неофициальное название следующего (после C17) основной Язык C стандартная редакция.[15] Ожидается, что голосование состоится не раньше 2021 года.[16]
В рамках процесса стандартизации ISO также публикует технические отчеты и спецификации относящиеся к языку C:
- ISO / IEC TR 19769: 2004,[17] на расширениях библиотеки для поддержки форматов преобразования Unicode, интегрированных в C11
- ISO / IEC TR 24731-1: 2007,[18] на расширениях библиотеки для поддержки интерфейсов с проверкой границ, интегрированных в C11
- ISO / IEC TR 18037: 2008,[19] на встроенных расширениях C
- ISO / IEC TR 24732: 2009,[20] на десятичная с плавающей запятой арифметика, замененная ISO / IEC TS 18661-2: 2015
- ISO / IEC TR 24747: 2009,[21] по специальным математическим функциям,
- ISO / IEC TR 24731-2: 2010,[22] на расширениях библиотеки для поддержки функций динамического распределения
- ISO / IEC TS 17961: 2013,[23] по безопасному кодированию на C
- ISO / IEC TS 18661-1: 2014,[24] на МЭК 60559: 2011-совместимая двоичная арифметика с плавающей запятой
- ISO / IEC TS 18661-2: 2015,[25] совместим с IEC 60559: 2011 десятичная с плавающей запятой арифметика
- ISO / IEC TS 18661-3: 2015,[26] на IEC 60559: 2011-совместимый обмен и расширенные типы с плавающей запятой
- ISO / IEC TS 18661-4: 2015,[27] о дополнительных функциях, совместимых с IEC 60559: 2011
Другие технические спецификации находятся в разработке и ожидают утверждения, включая пятую и последнюю часть TS 18661, спецификацию программного обеспечения для транзакционной памяти и расширения параллельных библиотек.[28]
Поддержка основных компиляторов
ANSI C теперь поддерживается почти всеми широко используемыми компиляторами. GCC и Clang - два основных компилятора C, популярных сегодня, оба основаны на C11 с обновлениями, включая изменения из более поздних спецификаций, таких как C17 и C18.[29][30] Написан любой исходный код Только в стандартном C и без каких-либо предположений, зависящих от оборудования, практически гарантируется правильная компиляция на любом Платформа с соответствующей реализацией C. Без таких мер предосторожности большинство программ может компилироваться только на определенной платформе или с определенным компилятором, например, из-за использования нестандартных библиотек, таких как GUI библиотеки, или полагаться на атрибуты компилятора или платформы, такие как точный размер определенных типов данных и байтов порядок байтов.
Обнаруживаемость соответствия
Чтобы смягчить различия между K&R C и стандарт ANSI C, __STDC__
("стандартный c") макрос может использоваться для разделения кода на разделы ANSI и K&R.
#if defined (__ STDC__) && __STDC__ внешний int Getopt(int, char * const *, const char *); #еще внешний int Getopt(); #endif
В приведенном выше примере прототип используется в объявлении функции для ANSI-совместимых реализаций, в то время как устаревшее объявление не-прототипа используется в противном случае. Они по-прежнему соответствуют требованиям ANSI, начиная с C99. Обратите внимание, как этот код проверяет и определение, и оценку: это потому, что некоторые реализации могут устанавливать __STDC__
до нуля, чтобы указать несоответствие ANSI.[31]
Компиляторы, поддерживающие ANSI C
- Комплект компилятора Amsterdam (C K&R и C89 / 90)
- РУКА RealView
- Лязг, с помощью LLVM бэкэнд
- GCC (полный C89 / 90, C99 и C11)
- Компилятор HP C / ANSI C (C89 и C99)[32]
- IBM XL C / C ++ (C11, начиная с версии 12.1)[33]
- Intel ICC
- LabWindows / CVI
- LCC
- OpenWatcom (C89 / 90 и некоторые C99)
- Microsoft Visual C ++ (C89 / 90 и некоторые C99)
- Пеллес С (Только C99 и C11. Windows.)[34]
- vbcc (C89 / 90 и C99)
- Крошечный компилятор C (C89 / 90 и некоторые C99)
- Oracle Developer Studio
Смотрите также
- Язык описания поведения
- Совместимость C и C ++
- C ++ 17, C ++ 14, C ++ 11, С ++ 03, C ++ 98, версии стандарта языка программирования C ++
- Технический отчет C ++ 1
Рекомендации
- ^ Брэд Келечава (14 сентября 2017). «Происхождение ANSI C и ISO C». Получено 2018-08-14.
- ^ «Стандарты - Использование коллекции компиляторов GNU (GCC)». Получено 2012-06-24.
- ^ «INCITS / ISO / IEC 9899». www.techstreet.com. Получено 2018-10-03.
- ^ «ISO / IEC 9899: 1990 - Языки программирования - C». Получено 2012-06-24.
- ^ Клайв Д.В. Перо (12.09.2010). «Краткое описание нормативного дополнения 1».
- ^ "ISO / IEC 9899: 1990 / Amd 1: 1995". Международная организация по стандартизации. 2013-03-22.
- ^ «ISO / IEC 9899: 1990 / Cor 1: 1994». ISO. Получено 2019-01-21.
- ^ «ISO / IEC 9899: 1990 / Cor 2: 1996». ISO. Получено 2019-01-21.
- ^ 14:00-17:00. «ISO / IEC 9899: 1999». ISO. Получено 2019-01-21.CS1 maint: числовые имена: список авторов (связь)
- ^ «INCITS / ISO / IEC 9899-2012». ANSI.
- ^ «ISO / IEC 9899: 1999 - Языки программирования - C». Получено 2012-06-24.
- ^ «ISO / IEC 9899: 2011 / Cor 1: 2012». Международная организация по стандартизации.
- ^ «ISO / IEC 9899: 2018 - Информационные технологии - Языки программирования - C». www.iso.org.
- ^ «Стандарт - С». www.iso-9899.info.
- ^ "История C". cppreference.
- ^ Майкл Ларабель (2018-10-18). "Компилятор GCC 9 добавляет -std = c2x и -std = gnu2x для будущего обновления языка C".
- ^ «ISO / IEC TR 19769: 2004». Международная организация по стандартизации.
- ^ «ISO / IEC TR 24731-1: 2007». Международная организация по стандартизации.
- ^ «ISO / IEC TR 18037: 2008». Международная организация по стандартизации.
- ^ «ISO / IEC TR 24732: 2009». Международная организация по стандартизации.
- ^ «ISO / IEC TR 24747: 2009». Международная организация по стандартизации.
- ^ «ISO / IEC TR 24731-2: 2010». Международная организация по стандартизации.
- ^ «ISO / IEC TS 17961: 2013». Международная организация по стандартизации.
- ^ «ISO / IEC TS 18661-1: 2014». Международная организация по стандартизации.
- ^ «ISO / IEC TS 18661-2: 2015». Международная организация по стандартизации.
- ^ «ISO / IEC TS 18661-3: 2015». Международная организация по стандартизации.
- ^ «ISO / IEC TS 18661-4: 2015». Международная организация по стандартизации.
- ^ См. Список на https://en.cppreference.com/w/c/experimental Посетил 16 января 2016 г.
- ^ «Использование коллекции компиляторов GNU (GCC): стандарты». gcc.gnu.org. Получено 2019-02-05.
- ^ «Совместимость языков». clang.llvm.org. Получено 2019-02-05.
- ^ «Стандартные предопределенные имена макросов». www.ibm.com. Получено 2019-04-10.
- ^ "Комплект разработчика HP C / ANSI C". Получено 2015-07-12.
- ^ В компиляторы IBM XL C / C ++ добавлена поддержка ISO C11.
- ^ ссылка на страницы Pelles C
дальнейшее чтение
- Шрайнер, Аксель-Тобиас (1993). Объектно-ориентированное программирование с помощью ANSI-C. Hanser. ISBN 3-446-17426-5.
внешняя ссылка
- Рабочая группа ISO C
- Проект стандарта ANSI C (ANSI X3J11 / 88-090) (13 мая 1988 г.), Третья публичная проверка
- Проект обоснования ANSI C (ANSI X3J11 / 88-151) (18 ноября, 1988)
- C Информационный бюллетень №1 (ANSI X3J11 / 93-007) (27 мая 1992 г.)
- Грамматика ANSI C Yacc
- «Языки программирования ISO / IEC 9899: 1999 - C». Американский национальный институт стандартов. Архивировано из оригинал на 2011-07-25. Получено 2009-08-06.
- "Действие по стандартам ANSI, том 36, № 48" (PDF). Американский национальный институт стандартов. 2005-12-02. Архивировано из оригинал (PDF) на 2016-03-04. Получено 2009-08-06.