C11 (ранее C1X ) - неофициальное название для ISO / IEC 9899: 2011, бывшего стандарта для языка программирования C. Он заменил C99 (стандарт ISO / IEC 9899: 1999) и был заменен на C18 (стандарт ISO / IEC 9899: 2018). C11 в основном стандартизирует функции, уже поддерживаемые распространенными современными компиляторами, и включает подробную модель памяти для лучшей поддержки нескольких потоков выполнения. Из-за задержки с выпуском соответствующих реализаций C99, C11 делает некоторые функции необязательными, чтобы упростить соответствие стандарту основного языка.
Окончательный вариант, N1570, был опубликован в апреле 2011 года. Новый стандарт прошел окончательный проект обзора состоялся 10 октября 2011 г. и был официально ратифицирован ISO и опубликован как ISO / IEC 9899: 2011 8 декабря 2011 г., без комментариев, требующих разрешения участвующих национальных органов.
Стандартный макрос __STDC_VERSION__
определяется со значением 201112L
, чтобы указать, что доступна поддержка C11. Некоторые функции C11 поддерживаются GCC начиная с версии 4.6, Clang начиная с версии 3.1, IBM XL C начиная с версии 12.1. И Microsoft Visual C ++ начиная с VS 2019 (16.8)
Стандарт включает в себя несколько изменений в спецификациях языка и библиотеки C99, таких как:
_Alignas
спецификатор, оператор _Alignof
, функция align_alloc
,
файл заголовка)_Noreturn
и файл заголовка
_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
спецификатор класса хранения,
заголовок, включая функции создания / управления потоком, мьютекс, условная переменная и поток- специальные функции хранения, а также
для атомарных операций, поддерживающих модель памяти C11).char16_t
и char32_t
типы для хранения данных в кодировке UTF-16 / UTF-32, включая функции преобразования в
и соответствующие префиксы строковых литералов u
и U
, а также префикс u8
для кодированных литералов UTF-8 ).gets
, устаревшей в предыдущем C l редакция стандарта языка, ISO / IEC 9899: 1999 / Cor.3: 2007 (E).struct T {int tag; объединение {float x; int n; }; };
.#if
и #error
, когда типы понимаются переводчиком."… x"
) для fopen
. Это ведет себя как O_CREAT | O_EXCL
в POSIX, который обычно используется для файлов блокировки.quick_exit
как третий способ завершить программу, предназначенный для выполнения хотя бы минимальной деинициализации, если завершение с помощью exit
не удалось.timespec_get
и соответствующая структура в
со степенью совместимости POSIX.действительное + мнимое * I
может не дать ожидаемого значения, если мнимое
бесконечно или NaN ).Новая версия позволяет реализациям не поддерживать определенные части стандарта, включая некоторые которые были обязательными для поддержки в редакции 1999 г. Программы могут использовать предопределенные макросы, чтобы определить, поддерживает ли реализация определенную функцию или нет.
Feature | Макрос проверки функций | Доступность в C99 |
---|---|---|
Анализируемость (Ann ex L) | __STDC_ANALYZABLE__ | Недоступно |
Интерфейсы проверки границ (Приложение K) | __STDC_LIB_EXT1__ | Недоступно |
Многопоточность ( ) | __STDC_NO_THREADS__ | Недоступно |
Атомарная примитивы и типы ( и квалификатор типа _Atomic ) | __STDC_NO_ATOMICS__ | Недоступно |
IEC 60559 арифметика с плавающей запятой (приложение F) | __STDC_IEC_559 __ | Необязательно |
МЭК 60559 совместимая комплексная арифметика (Приложение G) | __STDC_IEC_559_COMPLEX__ | Необязательно |
Сложные типы ( ) | __STDC_NO_COMPLEX__ | Обязательный для размещенных реализаций |
Массивы переменной длины | __ STDC_NO_VLA__ | Обязательный |
Необязательные интерфейсы проверки границ (Приложение K) остаются спорными и не получили широкого распространения, и было предложено их исключить или исключить из следующей версии стандарта. Даже Microsoft, главный сторонник этого интерфейса, не соответствует этому определению. Кроме того, Приложение K не включает более полезные TR24731-2 (функции динамического распределения), такие как vasprintf
и open_memstream
. Несколько реализаций с открытым исходным кодом включают Open Watcom C / C ++ "Safer C" библиотеку и safeclib.
Предшествовал. C99 | Язык C стандарты | Преуспел. C18 |