C11 (версия стандарта C) - C11 (C standard revision)
Редакции языка C |
---|
K&R C • ANSI C • C99 • C11 • C17 • C2x |
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] Некоторые функции C11 поддерживаются GCC начиная с версии 4.6,[6] Лязг начиная с версии 3.1,[7] IBM XL C начиная с версии 12.1.[8], и Microsoft Visual C ++ начиная с VS 2019 (16.8)[9]
Отличия от C99
Стандарт включает несколько изменений в спецификациях языка и библиотеки C99, таких как:[10]
- Выравнивание Технические характеристики (
_Alignas
спецификатор,_Alignof
операторвыровненный_аллок
функция<stdalign.h>
заголовочный файл) - В
_Без возврата
спецификатор функции и<stdnoreturn.h>
заголовочный файл - Типовые выражения с использованием
_Generic
ключевое слово. Например, следующий макросcbrt (x)
переводится наcbrtl (x)
,cbrt (x)
или жеcbrtf (x)
в зависимости от типаИкс
:
#define cbrt (x) _Generic ((x), long double: cbrtl, по умолчанию: cbrt, поплавок: cbrtf) (x)
- Многопоточность поддерживать (
_Thread_local
спецификатор класса хранения,<threads.h>
заголовок, включая функции создания / управления потоками, мьютекс, переменная состояния и хранилище для конкретных потоков функциональность, а также<stdatomic.h>
[11] для атомарных операций, поддерживающих модель памяти C11). - Улучшенный Unicode поддержка на основе Технического отчета C Unicode ISO / IEC TR 19769: 2004 (
char16_t
иchar32_t
типы для хранения UTF-16 /UTF-32 закодированные данные, включая функции преобразования в<uchar.h>
и соответствующиеты
иU
префиксы строковых литералов, а такжеu8
префикс для UTF-8 закодированные литералы).[12] - Удаление
получает
функция (в пользу более безопаснойfgets
), который был объявлен устаревшим в предыдущей версии стандарта языка C, ISO / IEC 9899: 1999 / Cor.3: 2007 (E). - Проверка границ интерфейсы (Приложение K).[13]
- Особенности анализируемости (Приложение L).
- Больше макросов для запроса характеристик типов с плавающей запятой, касающихся субнормальные числа с плавающей запятой и количество десятичных цифр, которые тип может хранить.
- Анонимный структуры и союзы, полезно, когда союзы и структуры вложены, например в
структура Т { int тег; союз { плавать Икс; int п; }; };
. - Статические утверждения, которые оцениваются во время перевода на более позднем этапе, чем
#если
и#ошибка
, когда переводчик понимает типы. - Эксклюзивный режим создания и открытия (
"…Икс"
суффикс) дляfopen
. Это ведет себя какO_CREAT | O_EXCL
в POSIX, который обычно используется для заблокировать файлы. - В
quick_exit
как третий способ завершения программы, предназначенный для выполнения хотя бы минимальной деинициализации, если завершение с помощьювыход
терпит неудачу.[14] - Новый
timespec_get
функция и соответствующая структура в<time.h>
со степенью POSIX совместимость. - Макросы для построения комплексные значения (отчасти потому, что
реальный + воображаемый * я
может не дать ожидаемого значения, есливоображаемый
бесконечно или NaN ).[15]
Дополнительные особенности
Новая редакция позволяет реализациям не поддерживать определенные части стандарта, включая те, которые были обязательными для поддержки в редакции 1999 года.[16] Программы могут использовать предопределенные макросы, чтобы определить, поддерживает ли реализация определенную функцию или нет.
Особенность | Макрос тестирования функций | Доступность в C99[17] |
---|---|---|
Возможность анализа (приложение L) | __STDC_ANALYZABLE__ | Нет в наличии |
Интерфейсы проверки границ (приложение K) | __STDC_LIB_EXT1__ | Нет в наличии |
Многопоточность (<threads.h> ) | __STDC_NO_THREADS__ | Нет в наличии |
Атомарные примитивы и типы (<stdatomic.h> и _Атомный квалификатор типа)[18] | __STDC_NO_ATOMICS__ | Нет в наличии |
IEC 60559 арифметика с плавающей запятой (Приложение F) | __STDC_IEC_559__ | Необязательный |
IEC 60559 совместимая комплексная арифметика (Приложение G) | __STDC_IEC_559_COMPLEX__ | Необязательный |
Сложные типы (<complex.h> ) | __STDC_NO_COMPLEX__ | Обязательно для размещенных реализаций |
Массивы переменной длины[19] | __STDC_NO_VLA__ | Обязательный |
Критика
Необязательные интерфейсы проверки границ (Приложение K) остаются спорными и не получили широкого распространения, и было предложено их исключить или удалить из следующей версии стандарта.[20] Даже Microsoft, главный сторонник этого интерфейса, не соответствует этому определению.[21] Кроме того, Приложение K не включает более полезные TR24731-2 (функции динамического распределения), такие как vasprintf
и open_memstream
.[22] Несколько реализаций с открытым исходным кодом включают Откройте Watcom Библиотека "Safer C" для C / C ++[23] и safeclib.[24]
Смотрите также
- C ++ 20, C ++ 17, C ++ 14, C ++ 11, С ++ 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 г.. Получено 2012-05-04.
- ^ «Серия выпусков 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.
- ^ Проект комитета WG14 N1516 - 4 октября 2010 г.
- ^ "Библиотека атомарных операций - cppreference.com". en.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
- ^ «N1969 - Обновленный полевой опыт с приложением K - Интерфейсы проверки границ». www.open-std.org.
- ^ Леффлер, Джонатан. "c - Вы используете" безопасные "функции TR 24731?". Переполнение стека.
- ^ "c - Вы используете" безопасные "функции TR 24731?". Переполнение стека.
- ^ «Безопасная библиотека C - откройте Watcom». 3 мая 2015.
- ^ "safec: Safe C Library - README". rurban.github.io.
внешняя ссылка
- Устав C1X
- N1570, окончательный вариант C1X от 12 апреля 2011 г.
- Официальный сайт рабочей группы ISO C
- Стандартный проект в простых ASCII и связанных HTML-формах в дополнение к PDF.
- Безопасная библиотека ограниченных API на языке C
- Слива, Томас (6 апреля 2012 г.). "C, наконец, получает новый стандарт". Журнал доктора Добба.
- Safe C API - Краткое решение проблемы переполнения буфера, Фонд OWASP, OWASP AppSec, Пекин, 2011 г.
Предшествует C99 | Язык C стандарты | Преемник C17 |