C11

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

Последняя черновая спецификация (доступная для бесплатного скачивания) имеет название N1570 и была издана в апреле 2011 года[6].

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

Определение стандартного макроса __STDC_VERSION__ со значением 201112L дает указание, что присутствует поддержка C11[7]. Некоторые возможности C11 поддерживаются GCC начиная с версии 4.6[8]. В Clang поддержка начинается с версии 3.1[9], а в IBM XL C поддержка с версии 12.1[10].

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

править

Последний черновик от 12 апреля 2011 года включает следующие изменения в языке C99 и спецификации библиотеки:[6][11]

  • Выравнивание данных. Для этого в язык добавили спецификатор _Alignas, оператор alignof, функцию aligned_alloc и заголовочный файл <stdalign.h>;
  • Спецификатор функции _Noreturn;
  • Выражения, не зависящие от типа (Type-generic expressions) с использованием ключевого слова _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>, включающий в себя функции по созданию и управлению потоками, мьютексами, мониторами и функции управления хранилищем потока (англ. en:Thread-local storage). Также в C11 добавили квалификатор типа _Atomic и заголовочный файл <stdatomic.h> для атомарных операций доступа к памяти;
  • Улучшенная поддержка Unicode, основанная на техническом отчете C Unicode Technical Report ISO/IEC TR 19769:2004 (типы char16_t и char32_t для хранения данных в кодировках UTF-16/UTF-32, функции преобразования, находящиеся в заголовочном файле <uchar.h> и соответствующие префиксы u и U перед строковыми литералами, как и префикс u8 для строк в кодировке UTF-8);
  • Функция gets, признанная устаревшей, удалена из текущей ревизии стандарта языка Си (ISO/IEC 9899:1999/Cor.3:2007(E));
  • Интерфейсы для проверки границ массива (англ. en:Bounds checking, Annex K).[12] ;
  • Возможности анализирования (англ. Analyzability features, Annex L);
  • Добавлено больше макросов для получения характеристик чисел с плавающей точкой, касающихся денормализованных чисел и максимального числа десятичных цифр, которые можно хранить без потери точности;
  • Анонимные структуры и объединения, используемые для вложения структур и объединений, например, struct T { int tag; union { float x; int n; }; };.
  • Статические утверждения (англ. assertion), которые лучше, чем команды препроцессора #if и #error, потому что утверждение вычисляется в более поздней стадии трансляции, когда компилятор «знает», что какого типа;
  • Привилегированный режим создания и открытия (англ. exclusive create-and-open mode) "…x" для функции fopen. Этот режим аналогичен режимам POSIX O_CREAT|O_EXCL и обычно используется для блокировки файлов;
  • Функция quick_exit — третья функция для завершения программы, с минимальной деинициализацией значений, если завершить программу функцией exit не удается[13];
  • Макросы для создания комплексных чисел (были добавлены потому, что код real imaginary*I мог не привести к ожидаемому значению, если мнимая часть была бесконечной или «не числом» (NaN)[14]).

Выборочные возможности

править

Новая ревизия стандарта позволяет реализациям не поддерживать определённые части стандарта, включая те, которые раньше надо было поддерживать обязательно (в C99)[15]. Программы могут использовать предопределённые макросы для определения того, поддерживает ли реализация часть стандарта или нет.

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

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

править

Некоторые функции C11 поддерживаются:

  • GCC начиная с версии 4.6
  • Clang начиная с версии 3.1
  • IBM XL C начиная с версии 12.1
  • Microsoft Visual C начиная с VS 2019 (16.8)

См. также

править
  • C99, предыдущая спецификация языка C
  • C 11, новый принятый стандарт C (известен также как C 0x — условное название во время его разработки)

Примечания

править
  1. ISO/IEC 9899:2011 — Information technology — Programming languages — C. Дата обращения: 22 декабря 2011. Архивировано 27 декабря 2011 года.
  2. ISO/IEC JTC1/SC22/WG14 is the international standardization working group for the programming language C. Дата обращения: 22 сентября 2011. Архивировано 12 февраля 2018 года.
  3. WG14 N1250 The C1X Charter. Дата обращения: 22 сентября 2011. Архивировано 24 сентября 2015 года.
  4. WG14 N1460 Subsetting the C Standard. Дата обращения: 22 сентября 2011. Архивировано 31 марта 2022 года.
  5. Brad Kelechava. The Current C Programming Language Standard – ISO/IEC 9899:2018 (C18). ANSI (13 ноября 2018). Дата обращения: 11 июня 2019. Архивировано 11 апреля 2022 года.
  6. 1 2 WG14 N1570 Committee Draft — April 12, 2011. Дата обращения: 22 сентября 2011. Архивировано 25 декабря 2021 года.
  7. Defect report #411. www.open-std.org. Дата обращения: 28 января 2016. Архивировано 18 января 2019 года.
  8. GCC 4.6 Release Series — Changes, New Features, and Fixes - GNU Project - Free Software Foundation (FSF). gcc.gnu.org. Дата обращения: 28 января 2016. Архивировано 4 ноября 2015 года.
  9. Clang 3.1 Release Notes. llvm.org. Дата обращения: 28 января 2016. Архивировано 4 марта 2016 года.
  10. Support for ISO C11 added to IBM XL C/C compilers (англ.). www.ibm.com (17 апреля 2014). Дата обращения: 28 января 2016. Архивировано 8 марта 2021 года.
  11. WG14 N1516 Committee Draft — October 4, 2010. Дата обращения: 22 сентября 2011. Архивировано 10 марта 2012 года.
  12. Berin Babcock-McConnell API02-C. Functions that read or write to or from an array should take an argument to specify the source or target size. Архивировано из оригинала 29 сентября 2011 года.
  13. WG14 N1327 Abandoning a Process. Дата обращения: 22 сентября 2011. Архивировано 20 января 2022 года.
  14. WG14 N1464 Creation of complex value. Дата обращения: 22 сентября 2011. Архивировано 10 марта 2012 года.
  15. WG14 N1548 Committee Draft — December 2, 2010 Архивная копия от 22 декабря 2017 на Wayback Machine 6.10.8.3 Conditional feature macros
  16. ISO 9899:1999 6.10.8 Predefined macro names
  17. WG14 N1558 Mar 14-18 meeting minutes (draft). Дата обращения: 22 сентября 2011. Архивировано 20 января 2022 года.

Ссылки

править