C11
C11 или ISO/IEC 9899:2011 (неофициально C1X) — новый стандарт для языка Си (ISO/IEC 9899:2011[1]), который заменил существующий стандарт C99. Официально о выпуске стандарта было объявлено 19 декабря 2011 года[2]. Эта версия стандарта большей частью стандартизирует возможности, существующие в распространённых современных компиляторах. Из-за плохой совместимости текущих реализаций C99 со стандартом, C11 включает в себя больше выборочных возможностей для упрощения совместимости со стандартом ядра языка. [3][4]. Хотя стандарт принят совсем нeдавно, но в GCC версии 4.6 уже есть зачаточная поддержка некоторых возможностей, описанных в черновике стандарта.[5]
Последняя черновая спецификация (доступная для бесплатного скачивания) имеет название N1570 и была издана в апреле 2011 года.[6]
Содержание |
Изменения по сравнению с C99 [править]
| Информация в этой статье или некоторых её разделах устарела.
Вы можете помочь проекту, обновив её и убрав после этого данный шаблон.
|
Последний черновик от 11 апреля 2011 года включает следующие изменения в языке C99 и спецификации библиотеки:[7]
- Выравнивание данных. Для этого в язык добавили спецификатор
_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)), была заменена новой безопасной альтернативойgets_s; - Интерфейсы для проверки границ массива (англ. en:Bounds_checking, Annex K).[8] ;
- Возможности анализирования (англ. Analyzability features, Annex L);
- Добавлено больше макросов для получения характеристик чисел с плавающей точкой, касающихся денормализованных чисел и максимального числа десятичных цифр, которые можно хранить без потери точности;
- Анонимные структуры и объединения, используемые для вложения структур и объединений, например,
struct T { int tag; union { float x; int n; }; };. - Статические утверждения (англ. assertion), которые лучше, чем команды препроцессора
#ifи#error, потому что утверждение вычисляется в более поздней стадии трансляции, когда компилятор «знает», что какого типа; - Привилегированный режим создания и открытия (англ. exclusive create-and-open mode)
"…x"для функции fopen. Этот режим аналогичен режимам POSIXO_CREAT|O_EXCLи обычно используется для блокировки файлов; - Функция
quick_exit— третья функция для завершения программы, с минимальной деинициализацией значений, если завершить программу функциейexitне удается[9]; - Макросы для создания комплексных чисел (были добавлены потому, что код
real + imaginary*Iмог не привести к ожидаемому значению, если мнимая часть была бесконечной или «не числом» (NaN)[10]).
Выборочные возможности [править]
Новая ревизия стандарта позволяет реализациям не поддерживать определённые части стандарта, включая те, которые раньше надо было поддерживать обязательно (в C99)[11]. Программы могут использовать предопределённые макросы для определения того, поддерживает ли реализация часть стандарта или нет.
| Возможность | Макрос | Доступность в C99[12] |
|---|---|---|
| Анализирование (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)[13] |
__STDC_NO_ATOMICS__ |
Недоступно |
| Массивы переменной длины | __STDC_NO_VLA__ |
Обязательно |
См. также [править]
- C99, предыдущая спецификация языка C
- C++11, новый принятый стандарт C++ (известен также как C++0x — условное название во время его разработки)
Примечания [править]
- ↑ ISO/IEC 9899:2011 — Information technology — Programming languages — C
- ↑ ISO/IEC JTC1/SC22/WG14 is the international standardization working group for the programming language C
- ↑ WG14 N1250 The C1X Charter
- ↑ WG14 N1460 Subsetting the C Standard
- ↑ GCC 4.6 Release Series — Changes, New Features, and Fixes — GNU Project — Free Software Foundation (FSF)
- ↑ http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf
- ↑ WG14 N1516 Committee Draft — October 4, 2010
- ↑ 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.
- ↑ WG14 N1327 Abandoning a Process
- ↑ WG14 N1464 Creation of complex value
- ↑ WG14 N1548 Committee Draft — December 2, 2010 6.10.8.3 Conditional feature macros
- ↑ ISO 9899:1999 6.10.8 Predefined macro names
- ↑ WG14 N1558 Mar 14-18 meeting minutes (draft)
Ссылки [править]
- The C1X Charter
- N1570, последний черновик стандарта C1X На 25 апреля 2011 года, датирован 2011-04-12.05.2013
- ISO C Working Group’s official website
- Plum, Thomas (April 6, 2012). «C Finally Gets A New Standard». Dr. Dobb's Journal.
| Стандарты языка Си |
| Предшественник: C99 |
| Язык программирования Си | |
|---|---|
| ANSI C (C89 и C90) • C99 • C11 | |
| Компиляторы | Borland Turbo C • Clang • GCC • LCC • Pelles C • PCC • TCC • Visual C++ (C++/CLI • C++/CX) • Watcom C/C++ compiler |
| Библиотеки | Стандартная библиотека языка Си • glibc • dietlibc • uClibc • Newlib • Eglibc • Bionic |
| Особенности | C-строка • Синтаксис • Препроцессор • Заголовочные файлы • Типы и объявления переменных • Функции |
| Избранные потомки | C++ • C# • D • Objective-C • Java • Alef • Limbo • Go • Vala |
| C и другие языки | C и C++ (Совместимость • Операторы) • Сравнение Pascal и C • Компилятор C в байт-код Java |
| Это заготовка статьи о компьютерных языках. Вы можете помочь проекту, исправив и дополнив её. |

