C11

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

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

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

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

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


Изменения по сравнению с C99[править | править код]

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

  • Выравнивание данных. Для этого в язык добавили спецификатор _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).[11] ;
  • Возможности анализирования (англ. 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 не удается[12];
  • Макросы для создания комплексных чисел (были добавлены потому, что код real + imaginary*I мог не привести к ожидаемому значению, если мнимая часть была бесконечной или «не числом» (NaN)[13]).

Выборочные возможности[править | править код]

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

Выборочные возможности в C1X
Возможность Макрос Доступность в C99[15]
Анализирование (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)[16] __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. http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf
  6. Defect report #411. www.open-std.org. Проверено 28 января 2016.
  7. [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.
  8. Clang 3.1 Release Notes. llvm.org. Проверено 28 января 2016.
  9. Support for ISO C11 added to IBM XL C/C++ compilers (англ.). www.ibm.com (17 April 2014). Проверено 28 января 2016.
  10. WG14 N1516 Committee Draft — October 4, 2010
  11. 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 года.
  12. WG14 N1327 Abandoning a Process
  13. WG14 N1464 Creation of complex value
  14. WG14 N1548 Committee Draft — December 2, 2010 6.10.8.3 Conditional feature macros
  15. ISO 9899:1999 6.10.8 Predefined macro names
  16. WG14 N1558 Mar 14-18 meeting minutes (draft)

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

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