Изменения языка C |
---|
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] Программы могут использовать предопределенные макросы, чтобы определить, поддерживает ли реализация определенную функцию или нет.
Характерная черта | Макрос тестирования функций | Доступность в C99 [17] |
---|---|---|
Возможность анализа (приложение L) | __STDC_ANALYZABLE__ | Недоступен |
Интерфейсы проверки границ (приложение K) | __STDC_LIB_EXT1__ | Недоступен |
Многопоточность ( <threads.h> ) | __STDC_NO_THREADS__ | Недоступен |
Атомарные примитивы и типы ( <stdatomic.h> и _Atomic квалификатор типа) [18] | __STDC_NO_ATOMICS__ | Недоступен |
МЭК 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] Несколько реализаций с открытым исходным кодом включают "Safer C" библиотеку Open Watcom C / C ++ [23] и safeclib. [24]
См. Также [ править ]
- 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 - С февраля 2012 . Проверено 4 мая 2012 .
- ^ «Серия выпусков GCC 4.6 - Изменения, новые функции и исправления - Проект GNU - Фонд свободного программного обеспечения (FSF)» . gcc.gnu.org .
- ^ «Примечания к выпуску Clang 3.1» . llvm.org .
- ^ «Добавлена поддержка ISO C11 в компиляторы IBM XL C / C ++» . 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 |