C11

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску

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

Последний черновик от 11 апреля 2011 года включает следующие изменения в языке C99 и спецификации библиотеки:[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__ Обязательно

См. также[править | править код]

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

Примечания[править | править код]

  1. ISO/IEC 9899:2011 — Information technology — Programming languages — C
  2. ISO/IEC JTC1/SC22/WG14 is the international standardization working group for the programming language C
  3. WG14 N1250 The C1X Charter
  4. WG14 N1460 Subsetting the C Standard
  5. Brad Kelechava. The Current C Programming Language Standard – ISO/IEC 9899:2018 (C18). ANSI (13 ноября 2018). Дата обращения 11 июня 2019.
  6. http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf
  7. Defect report #411. www.open-std.org. Дата обращения 28 января 2016.
  8. [http://gcc.gnu.org/gcc-4.6/changes.html#c GCC 4.6 Release Series — Changes, New Features, and Fixes - GNU Project - Free Software Foundation (FSF)]. gcc.gnu.org. Дата обращения 28 января 2016.
  9. Clang 3.1 Release Notes. llvm.org. Дата обращения 28 января 2016.
  10. Support for ISO C11 added to IBM XL C/C++ compilers (англ.). www.ibm.com (17 April 2014). Дата обращения 28 января 2016.
  11. WG14 N1516 Committee Draft — October 4, 2010
  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
  14. WG14 N1464 Creation of complex value
  15. WG14 N1548 Committee Draft — December 2, 2010 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)

Ссылки[править | править код]

Предшественник:
C99
Стандарты языка Си
Преемник:
C18