C11 (стандартная версия C)
Версии языка C |
---|
C11 (ранее C1X ) — неофициальное название ISO/IEC 9899:2011 . [1] прошлый стандарт языка программирования C. Он заменил C99 (стандарт ISO/IEC 9899:1999) и был заменен C17 (стандарт ISO/IEC 9899:2018). C11 в основном стандартизирует функции, уже поддерживаемые распространенными современными компиляторами, и включает подробную модель памяти для лучшей поддержки нескольких потоков выполнения. Из-за задержки доступности реализаций, соответствующих C99, C11 делает некоторые функции необязательными, чтобы упростить соответствие основному стандарту языка. [2] [3]
Окончательный проект, N1570, [4] был опубликован в апреле 2011 года. Новый стандарт прошел окончательную проверку проекта 10 октября 2011 года, был официально ратифицирован ISO и опубликован как ISO/IEC 9899:2011 8 декабря 2011 года без каких-либо комментариев, требующих разрешения участвующих национальных органов.
Стандартный макрос __STDC_VERSION__
определяется значением 201112L
чтобы указать, что доступна поддержка C11. [5]
Изменения по сравнению с C99
[ редактировать ]Стандарт включает несколько изменений в спецификации языка C99 и библиотеки, такие как [6]
- Спецификация выравнивания (
_Alignas
спецификатор,_Alignof
оператор,aligned_alloc
функция,<stdalign.h>
заголовок) - The
_Noreturn
спецификатор функции и<stdnoreturn.h>
заголовок - Типичные выражения с использованием
_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>
заголовок, включая функции создания/управления потоком, мьютекс , условную переменную и функции хранения, специфичные для потока , а также<stdatomic.h>
[7] для атомарных операций, поддерживающих модель памяти C11). - Улучшенная поддержка Unicode на основе технического отчета C Unicode ISO/IEC TR 19769:2004 (
char16_t
иchar32_t
типы для хранения данных в кодировке UTF-16 / UTF-32 , включая функции преобразования в<uchar.h>
и соответствующийu
иU
префиксы строковых литералов, а такжеu8
префикс для литералов в кодировке UTF-8 ). [8] - Удаление
gets
функция (в пользу более безопасногоfgets
), который был признан устаревшим в предыдущей версии стандарта языка C, ISO/IEC 9899:1999/Cor.3:2007(E). - Интерфейсы проверки границ (Приложение K). [9]
- Характеристики анализируемости (Приложение L).
- Дополнительные макросы для запроса характеристик типов с плавающей запятой, касающихся ненормальных чисел с плавающей запятой и количества десятичных цифр, которые этот тип может хранить.
- Анонимные структуры и объединения , полезны, когда объединения и структуры вложены, например в
struct T { int tag; union { float x; int n; }; };
. - Статические утверждения , которые оцениваются во время трансляции на более позднем этапе, чем
#if
и#error
, когда типы понимаются переводчиком. - Эксклюзивный режим создания и открытия (
"…x"
суффикс) дляfopen
. Это ведет себя какO_CREAT|O_EXCL
в POSIX , который обычно используется для файлов блокировки . - The
quick_exit
функционирует как третий способ завершения программы, предназначенный для выполнения хотя бы минимальной деинициализации. [10] - новый
timespec_get
функция и соответствующая структура в<time.h>
со степенью совместимости с POSIX . - Макросы для построения сложных значений (отчасти потому, что
real + imaginary*I
может не дать ожидаемого значения, еслиimaginary
бесконечно или NaN ). [11]
Дополнительные функции
[ редактировать ]Новая версия позволяет реализациям не поддерживать определенные части стандарта, включая те, которые были обязательными для поддержки в версии 1999 года. [12] Программы могут использовать предопределенные макросы, чтобы определить, поддерживает ли реализация определенную функцию или нет.
Особенность | Макрос проверки функций | Доступность в C99 [13] |
---|---|---|
Анализируемость (Приложение L) | __STDC_ANALYZABLE__
|
Нет в наличии |
Интерфейсы проверки границ (Приложение K) | __STDC_LIB_EXT1__
|
Нет в наличии |
Многопоточность ( <threads.h> )
|
__STDC_NO_THREADS__
|
Нет в наличии |
Атомарные примитивы и типы ( <stdatomic.h> и _Atomic классификатор типа) [14]
|
__STDC_NO_ATOMICS__
|
Нет в наличии |
IEC 60559 Арифметика с плавающей запятой (Приложение F) | __STDC_IEC_559__
|
Необязательный |
Комплексная арифметика, совместимая с IEC 60559 (Приложение G) | __STDC_IEC_559_COMPLEX__
|
Необязательный |
Сложные типы ( <complex.h> )
|
__STDC_NO_COMPLEX__
|
Обязательно для размещенных реализаций |
Массивы переменной длины [15] | __STDC_NO_VLA__
|
Обязательный |
Поддержка компилятора
[ редактировать ]Некоторые функции C11 поддерживаются GCC, начиная с версии 4.6. [16] Clang начиная с версии 3.1, [17] IBM XL C, начиная с версии 12.1, [18] и Microsoft Visual C++ , начиная с VS 2019 (16.8) [19] в сентябре 2020 года.
Критика
[ редактировать ]Дополнительные интерфейсы проверки границ (Приложение K) остаются спорными и не получили широкого распространения, и было предложено исключить их из следующей версии стандарта. [20] Даже Microsoft, главный сторонник этого интерфейса, не соответствует этому определению. [21] Кроме того, Приложение K не включает более полезные TR24731-2 (функции динамического распределения), такие как vasprintf
и open_memstream
. [22] Несколько реализаций с открытым исходным кодом включают библиотеку Open Watcom C/C++ «Safer C». [23] и сейфклиб. [24]
См. также
[ редактировать ]- C++23 , C++20 , C++17 , C++14 , C++11 , C++03 , C++98 , версии стандарта языка программирования C++.
- Совместимость C и C++
Ссылки
[ редактировать ]- ^ «ISO/IEC 9899:2011 – Информационные технологии. Языки программирования – C» . www.iso.org .
- ^ «WG14 N1250 Устав C1X» (PDF) .
- ^ «Подмножество стандарта C» . www.open-std.org .
- ↑ Проект комитета WG14 N1570 — 12 апреля 2011 г.
- ^ «Отчет о дефекте №411» . ISO/IEC JTC1/SC22/WG14 – C. Февраль 2012 г. Проверено 4 мая 2012 г.
- ↑ Проект комитета WG14 N1516 — 4 октября 2010 г.
- ^ «Библиотека атомарных операций — cppreference.com» . ru.cppreference.com .
- ^ «WG14 N1286 — «О поддержке TR-19769 и новых типов символов», Ник Стоутон, Ларри Дуайер» (PDF) .
- ^ Берин Бэбкок-МакКоннелл. «API02-C. Функции, которые читают или записывают в массив или из него, должны принимать аргумент, указывающий исходный или целевой размер» .
- ^ «Отказ от процесса» . www.open-std.org .
- ^ «Создание комплексной ценности» . www.open-std.org .
- ^ Проект комитета WG14 N1548 — 2 декабря 2010 г. 6.10.8.3 Макросы условных функций
- ^ ISO 9899:1999 6.10.8 Предопределенные имена макросов
- ^ «Протокол заседания WG14 N1558, 14–18 марта (проект)» (PDF) .
- ^ ISO 9899:2011 Языки программирования - C 6.7.6.2 4
- ^ «Серия выпусков GCC 4.6 — изменения, новые функции и исправления — Проект GNU — Фонд свободного программного обеспечения (FSF)» . gcc.gnu.org .
- ^ «Примечания к выпуску Clang 3.1» . llvm.org .
- ^ «В компиляторы IBM XL C/C++ добавлена поддержка ISO C11» . www.ibm.com . 17 апреля 2014 г.
- ^ «Стандартная поддержка C11 и C17 поступает в MSVC» . devblogs.microsoft.com . 14 сентября 2020 г.
- ^ «N1969 — Обновленный практический опыт работы с Приложением K — Интерфейсы проверки границ» . www.open-std.org .
- ^ Леффлер, Джонатан. "c - Используете ли вы "безопасные" функции TR 24731?" . Переполнение стека .
- ^ "c - Используете ли вы "безопасные" функции TR 24731?" . Переполнение стека .
- ^ «Безопасная библиотека C — Open Watcom» . 3 мая 2015 г. Архивировано из оригинала 3 мая 2015 г.
- ^ «safec: Библиотека Safe C — README» . rurban.github.io .
Дальнейшее чтение
[ редактировать ]- N1570 (рабочий проект стандарта C11); РГ14; 2011 г. ( версии HTML и ASCII )
- ISO/IEC 9899:2011 (официальный стандарт C11); ИСО ; 2011.
- Плам, Томас (6 апреля 2012 г.). «Наконец-то C получил новый стандарт» . Журнал доктора Добба .
- Safe C API — краткое решение проблемы переполнения буфера, The OWASP Foundation, OWASP AppSec, Пекин, 2011 г.