Лучшие вопросы
Таймлайн
Чат
Перспективы
C11
стандарт для языка Си Из Википедии, свободной энциклопедии
Remove ads
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].
Remove ads
Изменения по сравнению с 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]).
Remove ads
Выборочные возможности
Новая ревизия стандарта позволяет реализациям не поддерживать определённые части стандарта, включая те, которые раньше надо было поддерживать обязательно (в C99)[15]. Программы могут использовать предопределённые макросы для определения того, поддерживает ли реализация часть стандарта или нет.
Remove ads
Поддержка компиляторами
Некоторые функции C11 поддерживаются:
- GCC начиная с версии 4.6
- Clang начиная с версии 3.1
- IBM XL C начиная с версии 12.1
- Microsoft Visual C++ начиная с VS 2019 (16.8)
См. также
Примечания
Ссылки
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads