C11: различия между версиями
[непроверенная версия] | [непроверенная версия] |
В gcc 4.9 стандарт имеет полную поддержку: https://gcc.gnu.org/wiki/C11Status |
|||
Строка 22: | Строка 22: | ||
* Поддержка [[Многопоточность|многопоточности]], для этого в стандарт добавили спецификатор типа <code>_Thread_local</code>, заголовочный файл <code><threads.h></code>, включающий в себя функции по созданию и управлению потоками, [[мьютекс]]ами, [[Монитор (синхронизация)|мониторами]] и функции управления хранилищем потока (''англ.'' [[:en:Thread-local storage]]). Также в C11 добавили квалификатор типа <code>_Atomic</code> и заголовочный файл <code><stdatomic.h></code> для [[Атомарные операции|атомарных операций доступа к памяти]]; |
* Поддержка [[Многопоточность|многопоточности]], для этого в стандарт добавили спецификатор типа <code>_Thread_local</code>, заголовочный файл <code><threads.h></code>, включающий в себя функции по созданию и управлению потоками, [[мьютекс]]ами, [[Монитор (синхронизация)|мониторами]] и функции управления хранилищем потока (''англ.'' [[:en:Thread-local storage]]). Также в C11 добавили квалификатор типа <code>_Atomic</code> и заголовочный файл <code><stdatomic.h></code> для [[Атомарные операции|атомарных операций доступа к памяти]]; |
||
* Улучшенная поддержка [[Unicode]], основанная на техническом отчете C Unicode Technical Report ISO/IEC TR 19769:2004 (типы <code>char16_t</code> и <code>char32_t</code> для хранения данных в кодировках [[UTF-16]]/[[UTF-32]], функции преобразования, находящиеся в заголовочном файле <code><uchar.h></code> и соответствующие префиксы <code>u</code> и <code>U</code> перед строковыми литералами, как и префикс <code>u8</code> для строк в кодировке [[UTF-8]]); |
* Улучшенная поддержка [[Unicode]], основанная на техническом отчете C Unicode Technical Report ISO/IEC TR 19769:2004 (типы <code>char16_t</code> и <code>char32_t</code> для хранения данных в кодировках [[UTF-16]]/[[UTF-32]], функции преобразования, находящиеся в заголовочном файле <code><uchar.h></code> и соответствующие префиксы <code>u</code> и <code>U</code> перед строковыми литералами, как и префикс <code>u8</code> для строк в кодировке [[UTF-8]]); |
||
* Функция <code>[[gets]]</code>, признанная устаревшей в текущей ревизии стандарта языка Си (ISO/IEC 9899:1999/Cor.3:2007(E)) |
* Функция <code>[[gets]]</code>, признанная устаревшей в текущей ревизии стандарта языка Си (ISO/IEC 9899:1999/Cor.3:2007(E)); |
||
* Интерфейсы для проверки границ массива ({{lang-en|[[:en:Bounds checking]]}}, Annex K).<ref>{{cite web|last=Berin Babcock-McConnell|title=API02-C. Functions that read or write to or from an array should take an argument to specify the source or target size|url=https://www.securecoding.cert.org/confluence/display/seccode/API02-C.+Functions+that+read+or+write+to+or+from+an+array+should+take+an+argument+to+specify+the+source+or+target+size}}</ref> ; |
* Интерфейсы для проверки границ массива ({{lang-en|[[:en:Bounds checking]]}}, Annex K).<ref>{{cite web|last=Berin Babcock-McConnell|title=API02-C. Functions that read or write to or from an array should take an argument to specify the source or target size|url=https://www.securecoding.cert.org/confluence/display/seccode/API02-C.+Functions+that+read+or+write+to+or+from+an+array+should+take+an+argument+to+specify+the+source+or+target+size}}</ref> ; |
||
* Возможности анализирования ({{lang-en|Analyzability features}}, Annex L); |
* Возможности анализирования ({{lang-en|Analyzability features}}, Annex L); |
Версия от 09:43, 22 марта 2017
C11 или ISO/IEC 9899:2011 (неофициально C1X) — новый стандарт для языка Си (ISO/IEC 9899:2011[1]), который заменил существующий стандарт C99. Официально о выпуске стандарта было объявлено 19 декабря 2011 года[2]. Эта версия стандарта большей частью стандартизирует возможности, существующие в распространённых современных компиляторах. Из-за плохой совместимости текущих реализаций C99 со стандартом, C11 включает в себя больше выборочных возможностей для упрощения совместимости со стандартом ядра языка [3][4]. Хотя стандарт принят совсем недавно, но в GCC версии 4.9 уже обеспечена полная поддержка стандарта [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. Этот режим аналогичен режимам POSIXO_CREAT|O_EXCL
и обычно используется для блокировки файлов; - Функция
quick_exit
— третья функция для завершения программы, с минимальной деинициализацией значений, если завершить программу функциейexit
не удается[13]; - Макросы для создания комплексных чисел (были добавлены потому, что код
real + imaginary*I
мог не привести к ожидаемому значению, если мнимая часть была бесконечной или «не числом» (NaN)[14]).
Выборочные возможности
Новая ревизия стандарта позволяет реализациям не поддерживать определённые части стандарта, включая те, которые раньше надо было поддерживать обязательно (в C99)[15]. Программы могут использовать предопределённые макросы для определения того, поддерживает ли реализация часть стандарта или нет.
Возможность | Макрос | Доступность в 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 — условное название во время его разработки)
Примечания
- ↑ 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
- ↑ https://gcc.gnu.org/wiki/C11Status
- ↑ http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf
- ↑ Defect report #411 . www.open-std.org. Дата обращения: 28 января 2016.
- ↑ [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.
- ↑ Clang 3.1 Release Notes . llvm.org. Дата обращения: 28 января 2016.
- ↑ Support for ISO C11 added to IBM XL C/C++ compilers (англ.). www.ibm.com (17 апреля 2014). Дата обращения: 28 января 2016.
- ↑ 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.12.2024
- ISO C Working Group’s official website
- Plum, Thomas (April 6, 2012). "C Finally Gets A New Standard". Dr. Dobb's Journal.