C11
C11 або ISO/IEC 9899:2011 (неофіційно C1X) — стандарт для мови Сі (ISO/IEC 9899:2011[1]), який замінив чинний стандарт C99. Офіційно про випуск стандарту оголошено 19 грудня 2011[2]. Ця версія стандарту переважно стандартизує можливості, що існують у поширених сучасних компіляторах. Через погану сумісність поточних реалізацій C99 зі стандартом, C11 включає більше вибіркових можливостей для спрощення сумісності зі стандартом ядра мови[3]. Стандарт C18 (він же C17), що діє від 2018 року, фактично є уточненим варіантом C11, що виправляє знайдені в стандарті помилки[4].
Останню чернетку специфікації (доступна для безкоштовного звантаження) видано у квітні 2011 року під назвою N1570[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 та специфікації бібліотеки:
- Вирівнювання даних . Для цього в мову додали специфікатор
_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>
, що включає функції для створення та керування нитками, м'ютексами, моніторами і функції керування сховищем потоку. Також у C11 додано кваліфікатор типу_Atomic
і заголовний файл<stdatomic.h>
для атомарних операцій доступу до пам'яті; - Поліпшено підтримку Юнікоду, засновану на технічному звіті 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] (Annex K)[10];
- Можливості аналізування (англ. Analyzability features, Annex L);
- Додано більше макросів для отримання характеристик чисел з рухомою комою, що стосуються денормалізованих чисел та максимальної кількості десяткових цифр, які можна зберігати без втрати точності;
- Анонімні структури та об'єднання, що використовуються для вкладення структур та об'єднань, наприклад,
struct T { int tag; union { float x; int n; }; };
. - Статичні припущення, які кращі від команд препроцесора
#if
і#error
, оскільки припущення обчислюється на пізнішій стадії трансляції, коли компілятор «знає», що якого типу; - Привілейований режим створення та відкриття (англ. exclusive create-and-open mode)
"…x"
для функції fopen. Цей режим аналогічний режимам POSIX[en]O_CREAT|O_EXCL
і зазвичай використовується для блокування файлів; - Функція
quick_exit
— третя функція для завершення програми з мінімальною деініціалізацією значень, якщо завершити програму функцієюexit[en]
не вдається[11]; - Макроси для створення комплексних чисел (додані тому, що код
real + imaginary*I
міг не призвести до очікуваного значення, якщо уявна частина була нескінченною або «не числом» (NaN)).
Вибіркові можливості
ред.Нова ревізія стандарту дозволяє реалізаціям не підтримувати певні частини стандарту, зокрема ті, які раніше треба було підтримувати обов'язково (в C99). Програми можуть використовувати передвизначені макроси для з'ясування того, підтримує реалізація частину стандарту чи ні.
Можливість | Макрос | Доступність в C99 |
---|---|---|
Аналізування (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 )[12]
|
__STDC_NO_ATOMICS__
|
Недоступна |
Масиви змінної довжини | __STDC_NO_VLA__
|
Обов'язково |
Див. також
ред.Примітки
ред.- ↑ ISO/IEC 9899:2011 — Information technology — Programming languages — C. Архів оригіналу за 27 грудня 2011. Процитовано 30 березня 2022.
- ↑ ISO/IEC JTC1/SC22/WG14 is the international standardization working group for the programming language C. Архів оригіналу за 12 лютого 2018. Процитовано 30 березня 2022.
- ↑ WG14 N1460 Subsetting the C Standard. Архів оригіналу за 31 березня 2022. Процитовано 30 березня 2022.
- ↑ Brad Kelechava (13 листопада 2018). The Current C Programming Language Standard – ISO/IEC 9899:2018 (C18). ANSI. Архів оригіналу за 11 квітня 2022. Процитовано 11 червня 2019.
- ↑ Архівована копія (PDF). Архів оригіналу (PDF) за 25 грудня 2021. Процитовано 30 березня 2022.
{{cite web}}
: Обслуговування CS1: Сторінки з текстом «archived copy» як значення параметру title (посилання) - ↑ Defect report #411. www.open-std.org. Архів оригіналу за 18 січня 2019. Процитовано 28 січня 2016.
- ↑ GCC 4.6 Release Series — Changes, New Features, and Fixes - GNU Project - Free Software Foundation (FSF). gcc.gnu.org. Архів оригіналу за 4 листопада 2015. Процитовано 28 січня 2016.
- ↑ Clang 3.1 Release Notes. llvm.org. Архів оригіналу за 4 березня 2016. Процитовано 28 січня 2016.
- ↑ Support for ISO C11 added to IBM XL C/C++ compilers (англ.). www.ibm.com. 17 квітня 2014. Архів оригіналу за 8 березня 2021. Процитовано 28 січня 2016.
- ↑ 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. Архів оригіналу за 20 січня 2022. Процитовано 30 березня 2022.
- ↑ WG14 N1558 Mar 14-18 meeting minutes (draft) (PDF). Архів оригіналу (PDF) за 20 січня 2022. Процитовано 30 березня 2022.
Посилання
ред.- The C1X Charter [Архівовано 24 вересня 2015 у Wayback Machine.]
- N1570 [Архівовано 25 грудня 2021 у Wayback Machine.], остання чернетка стандарту C1X Станом на 25 квітня 2011, датований 12.04.2011
- ISO C Working Group's official website [Архівовано 12 лютого 2018 у Wayback Machine.]
- Plum, Thomas (6 квітня 2012). C Finally Gets A New Standard. Dr. Dobb's Journal. Архів оригіналу за 17 червня 2012. Процитовано 30 березня 2022.