Jump to content

C11 (стандартная версия C)

C11 (ранее C1X ) — неофициальное название ISO/IEC 9899:2011 . [1] прошлый стандарт языка программирования C. Он заменил C99 (стандарт ISO/IEC 9899:1999) и был заменен C17 (стандарт ISO/IEC 9899:2018). C11 в основном стандартизирует функции, уже поддерживаемые распространенными современными компиляторами, и включает подробную модель памяти для лучшей поддержки нескольких потоков выполнения. Из-за задержки доступности реализаций, соответствующих C99, C11 делает некоторые функции необязательными, чтобы упростить соответствие основному стандарту языка. [2] [3]

Окончательный проект, N1570, [4] был опубликован в апреле 2011 года. Новый стандарт прошел окончательную проверку проекта 10 октября 2011 года, был официально ратифицирован ISO и опубликован как ISO/IEC 9899:2011 8 декабря 2011 года без каких-либо комментариев, требующих разрешения участвующих национальных органов.

Стандартный макрос __STDC_VERSION__ определяется значением 201112L чтобы указать, что доступна поддержка C11. [5]

Изменения по сравнению с C99

[ редактировать ]

Стандарт включает несколько изменений в спецификации языка C99 и библиотеки, такие как [6]

  • Спецификация выравнивания ( _Alignas спецификатор, _Alignof оператор, aligned_alloc функция, <stdalign.h> заголовок)
  • The _Noreturn спецификатор функции и <stdnoreturn.h> заголовок
  • Типичные выражения с использованием _Generic ключевое слово. Например, следующий макрос cbrt(x) переводится на cbrtl(x), cbrt(x) или cbrtf(x) в зависимости от типа x:
#define cbrt(x) _Generic((x), long double: cbrtl, \
                              default: cbrt, \
                              float: cbrtf)(x)
  • Поддержка многопоточности ( _Thread_local спецификатор класса хранения, <threads.h> заголовок, включая функции создания/управления потоком, мьютекс , условную переменную и функции хранения, специфичные для потока , а также <stdatomic.h>[7] для атомарных операций, поддерживающих модель памяти C11).
  • Улучшенная поддержка Unicode на основе технического отчета C Unicode ISO/IEC TR 19769:2004 ( char16_t и char32_t типы для хранения данных в кодировке UTF-16 / UTF-32 , включая функции преобразования в <uchar.h> и соответствующий u и U префиксы строковых литералов, а также u8 префикс для литералов в кодировке UTF-8 ). [8]
  • Удаление gets функция (в пользу более безопасного fgets), который был признан устаревшим в предыдущей версии стандарта языка C, ISO/IEC 9899:1999/Cor.3:2007(E).
  • Интерфейсы проверки границ (Приложение K). [9]
  • Характеристики анализируемости (Приложение L).
  • Дополнительные макросы для запроса характеристик типов с плавающей запятой, касающихся ненормальных чисел с плавающей запятой и количества десятичных цифр, которые этот тип может хранить.
  • Анонимные структуры и объединения , полезны, когда объединения и структуры вложены, например в struct T { int tag; union { float x; int n; }; };.
  • Статические утверждения , которые оцениваются во время трансляции на более позднем этапе, чем #if и #error, когда типы понимаются переводчиком.
  • Эксклюзивный режим создания и открытия ( "…x" суффикс) для fopen. Это ведет себя как O_CREAT|O_EXCL в POSIX , который обычно используется для файлов блокировки .
  • The quick_exit функционирует как третий способ завершения программы, предназначенный для выполнения хотя бы минимальной деинициализации. [10]
  • новый timespec_get функция и соответствующая структура в <time.h> со степенью совместимости с POSIX .
  • Макросы для построения сложных значений (отчасти потому, что real + imaginary*I может не дать ожидаемого значения, если imaginary бесконечно или NaN ). [11]

Дополнительные функции

[ редактировать ]

Новая версия позволяет реализациям не поддерживать определенные части стандарта, включая те, которые были обязательными для поддержки в версии 1999 года. [12] Программы могут использовать предопределенные макросы, чтобы определить, поддерживает ли реализация определенную функцию или нет.

Дополнительные функции в C11
Особенность Макрос проверки функций Доступность в C99 [13]
Анализируемость (Приложение L) __STDC_ANALYZABLE__ Нет в наличии
Интерфейсы проверки границ (Приложение K) __STDC_LIB_EXT1__ Нет в наличии
Многопоточность ( <threads.h>) __STDC_NO_THREADS__ Нет в наличии
Атомарные примитивы и типы ( <stdatomic.h> и _Atomic классификатор типа) [14] __STDC_NO_ATOMICS__ Нет в наличии
IEC 60559 Арифметика с плавающей запятой (Приложение F) __STDC_IEC_559__ Необязательный
Комплексная арифметика, совместимая с IEC 60559 (Приложение G) __STDC_IEC_559_COMPLEX__ Необязательный
Сложные типы ( <complex.h>) __STDC_NO_COMPLEX__ Обязательно для размещенных реализаций
Массивы переменной длины [15] __STDC_NO_VLA__ Обязательный

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

[ редактировать ]

Некоторые функции C11 поддерживаются GCC, начиная с версии 4.6. [16] Clang начиная с версии 3.1, [17] IBM XL C, начиная с версии 12.1, [18] и Microsoft Visual C++ , начиная с VS 2019 (16.8) [19] в сентябре 2020 года.

Дополнительные интерфейсы проверки границ (Приложение K) остаются спорными и не получили широкого распространения, и было предложено исключить их из следующей версии стандарта. [20] Даже Microsoft, главный сторонник этого интерфейса, не соответствует этому определению. [21] Кроме того, Приложение K не включает более полезные TR24731-2 (функции динамического распределения), такие как vasprintf и open_memstream. [22] Несколько реализаций с открытым исходным кодом включают библиотеку Open Watcom C/C++ «Safer C». [23] и сейфклиб. [24]

См. также

[ редактировать ]
  1. ^ «ISO/IEC 9899:2011 – Информационные технологии. Языки программирования – C» . www.iso.org .
  2. ^ «WG14 N1250 Устав C1X» (PDF) .
  3. ^ «Подмножество стандарта C» . www.open-std.org .
  4. Проект комитета WG14 N1570 — 12 апреля 2011 г.
  5. ^ «Отчет о дефекте №411» . ISO/IEC JTC1/SC22/WG14 – C. Февраль 2012 г. Проверено 4 мая 2012 г.
  6. Проект комитета WG14 N1516 — 4 октября 2010 г.
  7. ^ «Библиотека атомарных операций — cppreference.com» . ru.cppreference.com .
  8. ^ «WG14 N1286 — «О поддержке TR-19769 и новых типов символов», Ник Стоутон, Ларри Дуайер» (PDF) .
  9. ^ Берин Бэбкок-МакКоннелл. «API02-C. Функции, которые читают или записывают в массив или из него, должны принимать аргумент, указывающий исходный или целевой размер» .
  10. ^ «Отказ от процесса» . www.open-std.org .
  11. ^ «Создание комплексной ценности» . www.open-std.org .
  12. ^ Проект комитета WG14 N1548 — 2 декабря 2010 г. 6.10.8.3 Макросы условных функций
  13. ^ ISO 9899:1999 6.10.8 Предопределенные имена макросов
  14. ^ «Протокол заседания WG14 N1558, 14–18 марта (проект)» (PDF) .
  15. ^ ISO 9899:2011 Языки программирования - C 6.7.6.2 4
  16. ^ «Серия выпусков GCC 4.6 — изменения, новые функции и исправления — Проект GNU — Фонд свободного программного обеспечения (FSF)» . gcc.gnu.org .
  17. ^ «Примечания к выпуску Clang 3.1» . llvm.org .
  18. ^ «В компиляторы IBM XL C/C++ добавлена ​​поддержка ISO C11» . www.ibm.com . 17 апреля 2014 г.
  19. ^ «Стандартная поддержка C11 и C17 поступает в MSVC» . devblogs.microsoft.com . 14 сентября 2020 г.
  20. ^ «N1969 — Обновленный практический опыт работы с Приложением K — Интерфейсы проверки границ» . www.open-std.org .
  21. ^ Леффлер, Джонатан. "c - Используете ли вы "безопасные" функции TR 24731?" . Переполнение стека .
  22. ^ "c - Используете ли вы "безопасные" функции TR 24731?" . Переполнение стека .
  23. ^ «Безопасная библиотека C — Open Watcom» . 3 мая 2015 г. Архивировано из оригинала 3 мая 2015 г.
  24. ^ «safec: Библиотека Safe C — README» . rurban.github.io .

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

[ редактировать ]
[ редактировать ]
Предшественник языка C Стандарты Преемник
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 4ffeeaba42c1a0a0ecb24290e5c4ed48__1708914480
URL1:https://arc.ask3.ru/arc/aa/4f/48/4ffeeaba42c1a0a0ecb24290e5c4ed48.html
Заголовок, (Title) документа по адресу, URL1:
C11 (C standard revision) - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)