Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

C11 (ранее C1X ) является неофициальным названием ISO / IEC 9899: 2011 , [1] прошлым стандарт для языка программирования Си . Он заменил 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] Clang, начиная с версии 3.1, [7] IBM XL C, начиная с версии 12.1, [8] и Microsoft Visual C ++, начиная с VS 2019 (16.8 ) [9] в сентябре 2020 года.

Изменения от C99 [ править ]

Стандарт включает несколько изменений в спецификации языка и библиотеки C99, например: [10]

  • Спецификация выравнивания ( _Alignasспецификатор, _Alignofоператор, aligned_allocфункция, <stdalign.h>заголовок)
  • Спецификатор _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>[11] для атомарных операций, поддерживающих модель памяти C11).
  • Улучшение Unicode , поддержка на основе C Технические Юникода Report ISO / IEC TR 19769: 2004 ( char16_tи char32_tтипы для хранения UTF-16 / UTF-32 кодированных данных, в том числе функции преобразования в <uchar.h>и соответствующие uи Uстроковые буквенные префиксы, а также u8префикс для Литералы в кодировке UTF-8 ). [12]
  • Удаление getsфункции (в пользу более безопасной fgets), которая была объявлена ​​устаревшей в предыдущей версии стандарта языка C, ISO / IEC 9899: 1999 / Cor.3: 2007 (E).
  • Интерфейсы проверки границ (Приложение K). [13]
  • Характеристики анализируемости (Приложение L).
  • Дополнительные макросы для запроса характеристик типов с плавающей запятой, касающихся субнормальных чисел с плавающей запятой и количества десятичных цифр, которые тип может хранить.
  • Анонимные структуры и союзы , полезные, когда союзы и структуры вложены, например, в .struct T { int tag; union { float x; int n; }; };
  • Статические утверждения , которые оцениваются во время перевода на более позднем этапе, чем #ifи #error, когда переводчик понимает типы.
  • Эксклюзивный режим создания и открытия ( "…x"суффикс) для fopen. Это ведет себя так же, как O_CREAT|O_EXCLв POSIX , который обычно используется для файлов блокировки .
  • quick_exitФункция как третий способ прекратить программу, намеревалась сделать по крайней мере , минимальной деинициализации если прекращение с exitнеудачей. [14]
  • Новая timespec_getфункция и соответствующая структура <time.h>со степенью совместимости с POSIX .
  • Макросы для построения сложных значений (отчасти потому, что real + imaginary*Iмогут не дать ожидаемого значения, если imaginaryоно бесконечно или NaN ). [15]

Дополнительные функции [ править ]

Новая редакция позволяет реализациям не поддерживать определенные части стандарта, в том числе те, которые были обязательными для поддержки в редакции 1999 года. [16] Программы могут использовать предопределенные макросы, чтобы определить, поддерживает ли реализация определенную функцию или нет.

Критика [ править ]

Необязательные интерфейсы проверки границ (Приложение K) остаются спорными и не получили широкого распространения, и было предложено их исключить или исключить из следующей версии стандарта. [20] Даже Microsoft, главный сторонник этого интерфейса, не соответствует определению. [21] Кроме того, Приложение K не включает более полезные TR24731-2 (функции динамического распределения), такие как vasprintfи open_memstream. [22] Несколько реализаций с открытым исходным кодом включают "Safer C" библиотеку Open Watcom C / C ++ [23] и safeclib. [24]

См. Также [ править ]

  • C ++ 20 , C ++ 17 , C ++ 14 , C ++ 11 , C ++ 03 , C ++ 98 , версии стандарта языка программирования C ++
  • Совместимость C и C ++

Ссылки [ править ]

  1. ^ «ISO / IEC 9899: 2011 - Информационные технологии - Языки программирования - C» . www.iso.org .
  2. ^ "WG14 N1250 Устав C1X" (PDF) .
  3. ^ "Подмножество стандарта C" . www.open-std.org .
  4. ^ WG14 N1570 комитет Проект - 12 апреля 2011
  5. ^ "Отчет о дефектах № 411" . ISO / IEC JTC1 / SC22 / WG14 - С февраля 2012 . Проверено 4 мая 2012 .
  6. ^ «Серия выпусков GCC 4.6 - Изменения, новые функции и исправления - Проект GNU - Фонд свободного программного обеспечения (FSF)» . gcc.gnu.org .
  7. ^ «Примечания к выпуску Clang 3.1» . llvm.org .
  8. ^ «Добавлена ​​поддержка ISO C11 в компиляторы IBM XL C / C ++» . www.ibm.com . 17 апреля 2014 г.
  9. ^ «Стандартная поддержка C11 и C17 прибывает в MSVC» . devblogs.microsoft.com . 14 сентября 2020.
  10. ^ WG14 N1516 комитет Проект - 4 октября 2010
  11. ^ "Библиотека атомарных операций - cppreference.com" . en.cppreference.com .
  12. ^ «WG14 N1286 -« О поддержке TR-19769 и новых типов символов », Ник Стаутон, Ларри Дуайер» (PDF) .
  13. ^ Берин Бэбкок-МакКоннелл. «API02-C. Функции, которые читают или записывают в массив или из него, должны принимать аргумент для указания исходного или целевого размера» .
  14. ^ «Отказ от процесса» . www.open-std.org .
  15. ^ «Создание сложной стоимости» . www.open-std.org .
  16. ^ WG14 N1548 Проект комитета - 2 декабря 2010 г. 6.10.8.3 Макросы условных функций
  17. ^ ISO 9899: 1999 6.10.8 Предопределенные имена макросов
  18. ^ "WG14 N1558 14-18 марта протокол собрания (черновик)" (PDF) .
  19. ^ ISO 9899: 2011 Языки программирования - C 6.7.6.2 4
  20. ^ «N1969 - Обновленный полевой опыт с приложением K - Интерфейсы проверки границ» . www.open-std.org .
  21. ^ Леффлер, Джонатан. "c - Вы используете" безопасные "функции TR 24731?" . Переполнение стека .
  22. ^ "c - Вы используете" безопасные "функции TR 24731?" . Переполнение стека .
  23. ^ «Более безопасная библиотека C - откройте Watcom» . 3 мая 2015.
  24. ^ "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 г.