C11: различия между версиями
[отпатрулированная версия] | [непроверенная версия] |
Alter73 (обсуждение | вклад) Нет описания правки Метки: с мобильного устройства из мобильной версии через расширенный мобильный режим |
|||
(не показаны 4 промежуточные версии 3 участников) | |||
Строка 1: | Строка 1: | ||
'''C11''' или '''ISO/IEC 9899:2011''' (неофициально '''C1X''') — [[Открытый стандарт|стандарт]] для языка [[Си (Язык программирования)|Си]] (ISO/IEC 9899:2011<ref>{{Cite web |url=http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=57853 |title=ISO/IEC 9899:2011 — Information technology — Programming languages — C<!-- Заголовок добавлен ботом --> |access-date=2011-12-22 |archive-date=2011-12-27 |archive-url=https://web.archive.org/web/20111227220239/http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=57853 |deadlink=no }}</ref>), который заменил существующий стандарт [[C99]]. Официально о выпуске стандарта было объявлено 19 декабря 2011 |
'''C11''' или '''ISO/IEC 9899:2011''' (неофициально '''C1X''') — [[Открытый стандарт|стандарт]] для языка [[Си (Язык программирования)|Си]] (ISO/IEC 9899:2011<ref>{{Cite web |url=http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=57853 |title=ISO/IEC 9899:2011 — Information technology — Programming languages — C<!-- Заголовок добавлен ботом --> |access-date=2011-12-22 |archive-date=2011-12-27 |archive-url=https://web.archive.org/web/20111227220239/http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=57853 |deadlink=no }}</ref>), который заменил существующий стандарт [[C99]]. Официально о выпуске стандарта было объявлено 19 декабря 2011 года<ref>{{Cite web |url=http://www.open-std.org/jtc1/sc22/wg14/ |title=ISO/IEC JTC1/SC22/WG14 is the international standardization working group for the programming language C |access-date=2011-09-22 |archive-date=2018-02-12 |archive-url=https://web.archive.org/web/20180212100115/http://www.open-std.org/JTC1/SC22/WG14/ |deadlink=no }}</ref>. Эта версия стандарта большей частью стандартизирует возможности, существующие в распространённых современных компиляторах<!--implementation-defined way means that the implementation is free to do what it likes, but must document its choice and stick to it. — http://gcc.gnu.org/onlinedocs/cpp/Implementation_002ddefined-behavior.html -->. Из-за плохой совместимости текущих реализаций C99 со стандартом C11 включает в себя больше выборочных возможностей для упрощения совместимости со стандартом ядра языка<ref name="N1250"/><ref>{{Cite web |url=http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1460.htm |title=WG14 N1460 Subsetting the C Standard |access-date=2011-09-22 |archive-date=2022-03-31 |archive-url=https://web.archive.org/web/20220331171904/http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1460.htm |deadlink=no }}</ref>. Действовавший с 2018 года стандарт {{iw|C17 (стандарт языка C)|C17|en|C17 (C standard revision)}} фактически являлся уточнённым вариантом C11, исправлявший найденные в стандарте ошибки<ref>{{cite web|author=Brad Kelechava|title=The Current C Programming Language Standard – ISO/IEC 9899:2018 (C18)|url=https://blog.ansi.org/2018/11/c-language-standard-iso-iec-9899-2018-c18/|website=ANSI|date=2018-11-13|accessdate=2019-06-11|archive-date=2022-04-11|archive-url=https://web.archive.org/web/20220411090330/https://blog.ansi.org/2018/11/c-language-standard-iso-iec-9899-2018-c18/|deadlink=no}}</ref>. |
||
Последняя черновая спецификация (доступная для бесплатного скачивания) имеет название N1570 и была издана в апреле 2011 |
Последняя черновая спецификация (доступная для бесплатного скачивания) имеет название N1570 и была издана в апреле 2011 года<ref name="N1570"/>. |
||
Новый стандарт прошел заключительный пересмотр черновика 10 октября 2011 |
Новый стандарт прошел заключительный пересмотр черновика 10 октября 2011 года и был официально ратифицирован ISO и опубликован в ISO / IEC 9899: 2011 8 декабря 2011 года без каких-либо замечаний. |
||
Определение стандартного макроса __STDC_VERSION__ со значением 201112L дает указание, что присутствует поддержка C11<ref>{{Cite web|accessdate = 2016-01-28|title = Defect report #411|url = http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_411.htm|publisher = www.open-std.org|archive-date = 2019-01-18|archive-url = https://web.archive.org/web/20190118005713/http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_411.htm|deadlink = no}}</ref>. Некоторые возможности C11 поддерживаются GCC начиная с версии 4.6<ref>{{Cite web|accessdate = 2016-01-28|title = GCC 4.6 Release Series — Changes, New Features, and Fixes - GNU Project - Free Software Foundation (FSF)|url = http://gcc.gnu.org/gcc-4.6/changes.html#c|publisher = gcc.gnu.org|archive-date = 2015-11-04|archive-url = https://web.archive.org/web/20151104124659/http://gcc.gnu.org/gcc-4.6/changes.html#c|deadlink = no}}</ref>. В Clang поддержка начинается с версии 3.1<ref>{{Cite web|accessdate = 2016-01-28|title = Clang 3.1 Release Notes|url = http://llvm.org/releases/3.1/docs/ClangReleaseNotes.html#cchanges|publisher = llvm.org|archive-date = 2016-03-04|archive-url = https://web.archive.org/web/20160304013843/http://llvm.org/releases/3.1/docs/ClangReleaseNotes.html#cchanges|deadlink = no}}</ref>, а в IBM XL C поддержка с версии 12.1<ref>{{Cite web|accessdate = 2016-01-28|date = 2014-04-17|lang = en|title = Support for ISO C11 added to IBM XL C/C++ compilers|url = http://www.ibm.com/developerworks/rational/library/support-iso-c11/index.html|publisher = www.ibm.com|archive-date = 2021-03-08|archive-url = https://web.archive.org/web/20210308010930/https://www.ibm.com/developerworks/rational/library/support-iso-c11/index.html|deadlink = no}}</ref>. |
Определение стандартного макроса __STDC_VERSION__ со значением 201112L дает указание, что присутствует поддержка C11<ref>{{Cite web|accessdate = 2016-01-28|title = Defect report #411|url = http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_411.htm|publisher = www.open-std.org|archive-date = 2019-01-18|archive-url = https://web.archive.org/web/20190118005713/http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_411.htm|deadlink = no}}</ref>. Некоторые возможности C11 поддерживаются GCC начиная с версии 4.6<ref>{{Cite web|accessdate = 2016-01-28|title = GCC 4.6 Release Series — Changes, New Features, and Fixes - GNU Project - Free Software Foundation (FSF)|url = http://gcc.gnu.org/gcc-4.6/changes.html#c|publisher = gcc.gnu.org|archive-date = 2015-11-04|archive-url = https://web.archive.org/web/20151104124659/http://gcc.gnu.org/gcc-4.6/changes.html#c|deadlink = no}}</ref>. В Clang поддержка начинается с версии 3.1<ref>{{Cite web|accessdate = 2016-01-28|title = Clang 3.1 Release Notes|url = http://llvm.org/releases/3.1/docs/ClangReleaseNotes.html#cchanges|publisher = llvm.org|archive-date = 2016-03-04|archive-url = https://web.archive.org/web/20160304013843/http://llvm.org/releases/3.1/docs/ClangReleaseNotes.html#cchanges|deadlink = no}}</ref>, а в IBM XL C поддержка с версии 12.1<ref>{{Cite web|accessdate = 2016-01-28|date = 2014-04-17|lang = en|title = Support for ISO C11 added to IBM XL C/C++ compilers|url = http://www.ibm.com/developerworks/rational/library/support-iso-c11/index.html|publisher = www.ibm.com|archive-date = 2021-03-08|archive-url = https://web.archive.org/web/20210308010930/https://www.ibm.com/developerworks/rational/library/support-iso-c11/index.html|deadlink = no}}</ref>. |
||
<!-- TODO: добавить шаблон вида{{Не переведено|есть=:en:English_Article|надо=Английская статья}}--> |
|||
== Изменения по сравнению с C99 == |
== Изменения по сравнению с C99 == |
||
Последний черновик от 12 апреля 2011 |
Последний черновик от 12 апреля 2011 года включает следующие изменения в языке C99 и спецификации библиотеки:<ref name="N1570"/><ref name="N1516"/> |
||
* [[Выравнивание данных]]. Для этого в язык добавили спецификатор <code>_Alignas</code>, оператор <code>alignof</code>, функцию <code>aligned_alloc</code> и [[заголовочный файл]] <code><stdalign.h></code>; |
* [[Выравнивание данных]]. Для этого в язык добавили спецификатор <code>_Alignas</code>, оператор <code>alignof</code>, функцию <code>aligned_alloc</code> и [[заголовочный файл]] <code><stdalign.h></code>; |
||
* Спецификатор функции <code>_Noreturn</code>; |
* Спецификатор функции <code>_Noreturn</code>; |
||
Строка 75: | Строка 73: | ||
| {{yes|Обязательно}} |
| {{yes|Обязательно}} |
||
|} |
|} |
||
== Поддержка компиляторами == |
|||
Некоторые функции C11 поддерживаются: |
|||
* [[GCC]] начиная с версии 4.6 |
|||
* [[Clang]] начиная с версии 3.1 |
|||
* [[IBM XL C]] начиная с версии 12.1 |
|||
* [[Microsoft Visual C++]] начиная с VS 2019 (16.8) |
|||
== См. также == |
== См. также == |
Текущая версия от 10:21, 1 декабря 2024
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. Этот режим аналогичен режимам 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__
|
Обязательно |
Поддержка компиляторами
[править | править код]Некоторые функции 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 — условное название во время его разработки)
Примечания
[править | править код]- ↑ ISO/IEC 9899:2011 — Information technology — Programming languages — C . Дата обращения: 22 декабря 2011. Архивировано 27 декабря 2011 года.
- ↑ ISO/IEC JTC1/SC22/WG14 is the international standardization working group for the programming language C . Дата обращения: 22 сентября 2011. Архивировано 12 февраля 2018 года.
- ↑ WG14 N1250 The C1X Charter . Дата обращения: 22 сентября 2011. Архивировано 24 сентября 2015 года.
- ↑ WG14 N1460 Subsetting the C Standard . Дата обращения: 22 сентября 2011. Архивировано 31 марта 2022 года.
- ↑ Brad Kelechava. The Current C Programming Language Standard – ISO/IEC 9899:2018 (C18) . ANSI (13 ноября 2018). Дата обращения: 11 июня 2019. Архивировано 11 апреля 2022 года.
- ↑ 1 2 WG14 N1570 Committee Draft — April 12, 2011 . Дата обращения: 22 сентября 2011. Архивировано 25 декабря 2021 года.
- ↑ Defect report #411 . www.open-std.org. Дата обращения: 28 января 2016. Архивировано 18 января 2019 года.
- ↑ GCC 4.6 Release Series — Changes, New Features, and Fixes - GNU Project - Free Software Foundation (FSF) . gcc.gnu.org. Дата обращения: 28 января 2016. Архивировано 4 ноября 2015 года.
- ↑ Clang 3.1 Release Notes . llvm.org. Дата обращения: 28 января 2016. Архивировано 4 марта 2016 года.
- ↑ Support for ISO C11 added to IBM XL C/C++ compilers (англ.). www.ibm.com (17 апреля 2014). Дата обращения: 28 января 2016. Архивировано 8 марта 2021 года.
- ↑ WG14 N1516 Committee Draft — October 4, 2010 . Дата обращения: 22 сентября 2011. Архивировано 10 марта 2012 года.
- ↑ 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 года.
- ↑ WG14 N1327 Abandoning a Process . Дата обращения: 22 сентября 2011. Архивировано 20 января 2022 года.
- ↑ WG14 N1464 Creation of complex value . Дата обращения: 22 сентября 2011. Архивировано 10 марта 2012 года.
- ↑ WG14 N1548 Committee Draft — December 2, 2010 Архивная копия от 22 декабря 2017 на Wayback Machine 6.10.8.3 Conditional feature macros
- ↑ ISO 9899:1999 6.10.8 Predefined macro names
- ↑ WG14 N1558 Mar 14-18 meeting minutes (draft) . Дата обращения: 22 сентября 2011. Архивировано 20 января 2022 года.
Ссылки
[править | править код]- The C1X Charter
- N1570, последний черновик стандарта C1X На 25 апреля 2011 года, датирован 12.04.2011
- ISO C Working Group’s official website
- Plum, Thomas. C Finally Gets A New Standard (англ.) // Dr. Dobb's Journal : magazine. — 2012. — 8 April.