C23 (стандартная версия C)
Версии языка C |
---|
C23 — неофициальное название ISO/IEC 9899:2024 , следующего стандарта языка программирования C , который заменит C17 (стандарт ISO/IEC 9899:2018). [1] Он был запущен в 2016 году неофициально как C2x, [2] и ожидалось, что он будет опубликован в 2024 году. [3] Последний общедоступный рабочий проект C23 был выпущен 1 апреля 2023 года. [4] Первое заседание WG14 по проекту C2x состоялось в октябре 2019 года. [5] проводились виртуальные дистанционные встречи В 2020 году из-за пандемии COVID-19 , затем до 2024 года продолжали проводиться различные телеконференции.
Функции
[ редактировать ]Изменения, включенные в последний рабочий проект C23, перечислены ниже. [4]
Стандартная библиотека
[ редактировать ]Новые функции
[ редактировать ]- Добавлять
memset_explicit()
функционировать в<string.h>
для удаления конфиденциальных данных, где сохранение в памяти должно выполняться всегда, независимо от оптимизации. [6] - Добавлять
memccpy()
функционировать в<string.h>
для эффективного объединения строк — аналогично расширениям C POSIX и SVID . [7] - Добавлять
strdup()
иstrndup()
функции в<string.h>
для выделения копии строки – аналогично расширениям C POSIX и SVID . [8] - Добавлять
memalignment()
функционировать в<stdlib.h>
для определения выравнивания байтов указателя. [9] - Добавьте служебные функции/макросы/типы битов в новый заголовок.
<stdbit.h>
для изучения многих целочисленных типов. Все начинается сstdc_
чтобы минимизировать конфликт с устаревшим кодом и сторонними библиотеками. [10]- Далее замените
*
сuc
,us
,ui
,ul
,ull
для пяти имен функций или пусто для макроса общего типа. [10] - Добавлять
stdc_count_ones*()
иstdc_count_zeros*()
для подсчета количества 1 или 0 бит в значении. [10] - Добавлять
stdc_leading_ones*()
иstdc_leading_zeros*()
для подсчета ведущих 1 или 0 битов значения. [10] - Добавлять
stdc_trailing_ones*()
иstdc_trailing_zeros*()
для подсчета конечных 1 или 0 битов значения. [10] - Добавлять
stdc_first_leading_one*()
иstdc_first_leading_zero*()
чтобы найти первый ведущий бит со значением 1 или 0. [10] - Добавлять
stdc_first_trailing_one*()
иstdc_first_trailing_zero*()
чтобы найти первый конечный бит со значением 1 или 0. [10] - Добавлять
stdc_has_single_bit*()
чтобы определить, является ли значение точной степенью 2 (возвращает true тогда и только тогда, когда существует один бит 1). [10] - Добавлять
stdc_bit_floor*()
определить наибольшую целую степень 2, не превышающую значение. [10] - Добавлять
stdc_bit_ceil*()
определить наименьшую целую степень 2, которая не меньше значения. [10] - Добавлять
stdc_bit_width*()
чтобы определить количество битов для представления значения. [10]
- Далее замените
- Добавлять
timegm()
функционировать в<time.h>
для преобразования структуры времени в значение календарного времени - аналогично функции в библиотеках glibc и musl . [11] - Новый
<math.h>
функции, основанные на рекомендациях IEEE 754-2019, такие как функции тригонометрии, работающие с единицами иexp10
. [12]
Существующие функции
[ редактировать ]- Добавлять
%b
спецификатор двоичного преобразования вprintf()
функциональное семейство. [13] - Добавлять
%b
спецификатор двоичного преобразования вscanf()
функциональное семейство. [13] - Добавлять
0b
и0B
поддержка двоичного преобразования вstrtol()
иwcstol()
функциональные семейства. [13] - Сделайте функции
bsearch()
,bsearch_s()
,memchr()
,strchr()
,strpbrk()
,strrchr()
,strstr()
и их широкие аналогиwmemchr()
,wcschr()
,wcspbrk()
,wcsrchr()
,wcsstr()
вернуть константный объект, если он был передан им. [14]
Препроцессор
[ редактировать ]- Добавлять
#elifdef
и#elifndef
директивы , [15] которые по сути эквивалентны#elif defined
и#elif !defined
. Обе директивы были добавлены в стандарт C++23 и GCC 12. [16] - Добавлять
#embed
директива для включения двоичных ресурсов и__has_embed
позволяя проверять доступность ресурса с помощью директив препроцессора. [17] - Добавлять
#warning
направление на диагностику. [18] - Добавлять
__has_include
возможность проверки доступности заголовка с помощью директив препроцессора. [19] - Добавлять
__has_c_attribute
позволяя проверять доступность атрибута с помощью директив препроцессора. [20] (новую функцию атрибута см. в группе «Совместимость с C++») - Добавлять
__VA_OPT__
функциональный макрос для макросов с вариациями , который расширяется до своего аргумента только в том случае, если аргумент с вариацией был передан содержащему макросу. [21]
Типы
[ редактировать ]- Добавлять
nullptr_t
, тип нулевого указателя . [22] - Добавлять
_BitInt(N)
иunsigned _BitInt(N)
типы для целых чисел с точностью до бита. ДобавлятьBITINT_MAXWIDTH
макрос для максимальной разрядности. [23] [24] - Добавлять
ckd_add()
,ckd_sub()
,ckd_mul()
макросы для проверяемых целочисленных операций. [25] - Типы с изменяющимися переменными (но не VLA , которые представляют собой автоматические переменные, размещаемые в стеке) становятся обязательной функцией. [26]
- Лучшая поддержка использования
const
с массивами. [27] - Стандартизация
typeof(...)
оператор. [28] - Значение
auto
Ключевое слово было изменено, чтобы вызвать вывод типа , сохраняя при этом свое старое значение спецификатора класса хранения, если оно использовалось вместе с типом. В отличие от C++ , C23 допускает вывод типа только для определений объектов (без вывода типа возвращаемого значения функции или типа параметра функции). [29] - Правила совместимости для структурных, объединенных и перечислимых типов были изменены, чтобы разрешить повторное объявление совместимого типа с тем же тегом. [30]
- Целое число точной ширины теперь может превышать
intmax_t
(N2888). [31]
Константы
[ редактировать ]- Добавлять
nullptr
постоянная дляnullptr_t
тип. [22] - Добавлять
wb
иuwb
целочисленные литеральные суффиксы для_BitInt(N)
иunsigned _BitInt(N)
типы, [32] такой как6uwb
даетunsigned _BitInt(3)
, и-6wb
даетsigned _BitInt(4)
который имеет три бита значения и один знаковый бит. - Добавлять
0b
и0B
двоичные константные префиксы, [33] такой как0b10101010
(соответствует 0xAA). - Добавлять
'
цифровой разделитель в литеральные константы, [34] такой как0xFE'DC'BA'98
(соответствует 0xFEDCBA98),299'792'458
(соответствует 299792458 ),1.414'213'562
(что соответствует 1,414213562 ). - Добавьте возможность указать базовый тип
enum
. [35] - Позволять
enum
s без фиксированного базового типа для хранения значений, которые не могут быть представленыint
. [36]
Ключевые слова
[ редактировать ]- Добавлять
true
иfalse
ключевые слова. [37] - Добавлять
alignas
,alignof
,bool
,static_assert
,thread_local
ключевые слова. Ранее определенные ключевые слова становятся альтернативными вариантами написания:_Alignas
,_Alignof
,_Bool
,_Static_assert
,_Thread_local
. [38] - Добавлять
_BitInt
ключевое слово (см. группу «типы») - Добавлять
typeof
иtypeof_unqual
ключевые слова (см. группу «типы») - Добавлять
nullptr
ключевое слово (см. группу «константы») - Добавлять
constexpr
ключевое слово (см. группу «другое») - Добавлять
_Decimal32
,_Decimal64
,_Decimal128
ключевые слова для (необязательной) десятичной арифметики с плавающей запятой (см. группу «другое»)
Синтаксис
[ редактировать ]- Метки могут появляться перед объявлениями и в конце составных операторов . [39]
- Безымянные параметры в определениях функций. [40]
- Нулевая инициализация с
{}
(включая инициализацию VLA). [41] - Вариадным функциям больше не нужен именованный аргумент перед многоточием и
va_start
Макросу больше не нужен второй аргумент, и он не оценивает аргументы после первого, если они есть. [42] - Добавить C++11. стиля атрибута синтаксис [43] используя двойные квадратные скобки
[[]]
. В дополнение к атрибутам C++11 , перечисленным ниже, добавьте новые атрибуты: - Добавить один аргумент
_Static_assert
для совместимости с C++17 . [45] - Функции без аргументов, указанные в прототипе
void foo()
понимаются как не имеющие аргументов (см. удаление объявлений функций K&R)
Совместимость с С++
[ редактировать ]- Различные изменения синтаксиса улучшают совместимость с C++, например, метки перед объявлениями, безымянные аргументы функций, нулевая инициализация с помощью
{}
, вариативные функции без именованного аргумента, C++11 , атрибуты стиля_Static_assert
(см. Синтаксис). Для меток в конце составных операторов в C++23 было внесено соответствующее изменение . [46] - Добавьте атрибуты в стиле C++ (см. Синтаксис). Добавить атрибуты [47]
[[deprecated]]
, [48][[fallthrough]]
, [49][[maybe_unused]]
, [50][[nodiscard]]
, [51] и[[noreturn]]
атрибут для совместимости с C++11 , затем объявить устаревшим_Noreturn
,noreturn
, заголовок<stdnoreturn.h>
функции, представленные в C11 . [52] Дублирование атрибутов разрешено для совместимости с C++23 . [53] Все стандартные атрибуты также могут быть окружены двойным подчеркиванием (например,[[__deprecated__]]
эквивалентно[[deprecated]]
). - Добавлять
u8
префикс для символьных литералов , представляющий кодировку UTF-8 для совместимости с C++17 . [54] [55] - Добавлять
#elifdef
и#elifndef
директивы предварительной обработки для совместимости с C++23 . [15] (см. группу «препроцессор»)
Другие особенности
[ редактировать ]- Поддержка ISO/IEC 60559:2020, текущей версии стандарта IEEE 754 для арифметики с плавающей запятой, с расширенной двоичной арифметикой с плавающей запятой и (дополнительно) десятичной арифметикой с плавающей запятой. [56] [57]
- The
constexpr
спецификатор для объектов, но не функций, в отличие от эквивалента C++ . [58] - Добавлять
char8_t
тип для хранения данных в кодировке UTF-8 и измените тип символьных констант u8 и строковых литералов наchar8_t
. Кроме того, функцииmbrtoc8()
иc8rtomb()
для преобразования узкого многобайтового символа в кодировку UTF-8 и одной кодовой точки из UTF-8 в представление узкого многобайтового символа соответственно. [59] - Уточните, что все
char16_t
строки и литералы должны иметь кодировку UTF-16 , и всеchar32_t
строки и литералы должны иметь кодировку UTF-32 , если явно не указано иное. [60] - Разрешить спецификаторов класса хранения в определении составного литерала. появление [61]
Устаревшие функции
[ редактировать ]Некоторые старые устаревшие функции либо удалены, либо признаны устаревшими из рабочего проекта C23:
- Удалить триграфы . [62]
- Удалите определения/объявления функций K&R (без информации об аргументах функции). [63] [64]
- Удалите представления для целых чисел со знаком, отличных от дополнения до двух. дополнении до двух . Потребуется целое число со знаком в [65]
- The
*_HAS_SUBNORM
макросы в<float.h>
являются устаревшими функциями. [66]
Поддержка компилятора
[ редактировать ]ССЗ 9 , [67] Кланг 9.0, [68] и Пеллес С 11.00 [69] компиляторы реализуют экспериментальный флаг компилятора для поддержки этого стандарта.
См. также
[ редактировать ]- C++23 , C++20 , C++17 , C++14 , C++11 , C++03 , C++98 , версии стандарта языка программирования C++.
- Совместимость C и C++
Ссылки
[ редактировать ]- ^ «История Си» . cppreference.com . 27.06.2022. Архивировано из оригинала 19 октября 2022 года.
- ^ «WG14-N2086: Устав C2x» . open-std.org . 20 сентября 2016 г. Архивировано из оригинала 22 декабря 2022 года.
- ^ «WG14-N3156: Обновленное расписание C23» (PDF) . open-std.org . 19 июля 2023 г. Архивировано (PDF) из оригинала 29 января 2024 г.
- ^ Jump up to: а б «WG14-N3096: Проект ISO/IEC 9899:2024» (PDF) . open-std.org . 1 апреля 2023 г. Архивировано (PDF) из оригинала 2 апреля 2023 г.
- ^ «WG14-N2437: Повестка дня на октябрь 2019 г.» . open-std.org . 21.10.2019. Архивировано из оригинала 5 марта 2021 года.
- ^ «WG14-N2897: memset_explicit()» . open-std.org . 2021-12-27. Архивировано из оригинала 25 октября 2022 года.
- ^ «WG14-N2349: На пути к более эффективному копированию и конкатенации строк» . open-std.org . 18 марта 2019 г. Архивировано из оригинала 30 сентября 2022 года.
- ^ «WG14-N2353: strdup() и strndup()» . open-std.org . 18 марта 2019 г. Архивировано из оригинала 24 декабря 2022 года.
- ^ «WG14-N2974: Запрашиваемое выравнивание указателя» (PDF) . open-std.org . 15 апреля 2022 г. Архивировано (PDF) из оригинала 13 октября 2022 г.
- ^ Jump up to: а б с д и ж г час я дж к «WG14-N3022: Современные битовые утилиты» . open-std.org . 06.07.2022. Архивировано из оригинала 24 декабря 2022 года.
- ^ «WG14-N2833: Добавьте timegm() как необязательную часть time.h» . open-std.org . 07.10.2021. Архивировано из оригинала 1 декабря 2021 года.
- ^ Полезный обзор см. в N3096 § B.11. Функции были добавлены в отдельные документы: N2488, его обновленные версии и ссылки.
- ^ Jump up to: а б с «WG14-N2630: форматированный ввод/вывод целых двоичных чисел» (PDF) . open-std.org . 01.01.2021. Архивировано (PDF) из оригинала 14 декабря 2022 г.
- ^ «WG14-N3020: Функции стандартной библиотеки, сохраняющие квалификаторы» (PDF) . open-std.org . 13.06.2022. Архивировано (PDF) из оригинала 13 октября 2022 г.
- ^ Jump up to: а б «WG14-N2645: Добавить поддержку директив предварительной обработки #elifdef и #elifndef» (PDF) . open-std.org . 25 января 2020 г. Архивировано (PDF) из оригинала 28 ноября 2022 г.
- ^ «В GCC 12 добавлена поддержка новых директив #elifdef #elifndef» . фороникс . 12 мая 2021 г. Архивировано из оригинала 27 декабря 2022 г.
- ^ «WG14-N3017: #embed — сканируемый, удобный для инструментов механизм включения двоичных ресурсов» . open-std.org . 27.06.2022. Архивировано из оригинала 24 декабря 2022 года.
- ^ «WG14-N2686: #предупреждение» (PDF) . open-std.org . 22 июля 2022 г. Архивировано (PDF) из оригинала 28 ноября 2022 г.
- ^ «WG14-N2799: __has_include для C» (PDF) . open-std.org . 2021-08-30. Архивировано (PDF) из оригинала 24 декабря 2022 г.
- ^ «WG14-N2553: Запрос поддержки атрибутов» (PDF) . open-std.org . 04.08.2020. Архивировано (PDF) из оригинала 14 октября 2022 г.
- ^ «WG14-N3033: Пропуск и удаление запятых» . open-std.org . 20 июля 2022 г. Архивировано из оригинала 27 декабря 2022 года.
- ^ Jump up to: а б «WR14-N3042: Введите константу nullptr» . open-std.org . 22 июля 2022 г. Архивировано из оригинала 24 декабря 2022 года.
- ^ «WG14-N2763: Добавление фундаментального типа для N-битных целых чисел» (PDF) . open-std.org . 21 июня 2021 г. Архивировано (PDF) из оригинала 27 декабря 2022 г.
- ^ «WG14-N3035: исправления _BitInt» (PDF) . open-std.org . 21 июля 2022 г. Архивировано (PDF) из оригинала 13 октября 2022 г.
- ^ «WG14-N2867: Проверенные N-битные целые числа» (PDF) . open-std.org . 2021-11-28. Архивировано (PDF) из оригинала 14 декабря 2022 г.
- ^ «WG14-N2778: Типы с переменными изменениями» (PDF) . open-std.org . 11 июля 2021 г. Архивировано (PDF) из оригинала 22 декабря 2022 г.
- ^ «WG14-N2607: Совместимость указателей на массивы с квалификаторами» (PDF) . open-std.org . 2020-10-31. Архивировано (PDF) из оригинала 13 октября 2022 г.
- ^ «WG14-N2899: Не все так волшебно — typeof для C» . open-std.org . 21 января 2022 г. Архивировано из оригинала 24 декабря 2022 года.
- ^ «WG14-N3007: Вывод типа для определений объектов» . open-std.org . 10.06.2022. Архивировано из оригинала 24 декабря 2022 года.
- ^ «WG14-N3037: Улучшенные правила совместимости тегов (обновления N3032)» (PDF) .
- ^ «C23 завершен: вот что в меню» . Пастбище . 31 июля 2022 г.
- ^ «WG14-N2775: Буквенные суффиксы для целых чисел с точностью до бита» (PDF) . open-std.org . 2021-07-13. Архивировано (PDF) из оригинала 27 декабря 2022 г.
- ^ «WG14-N2549: Разрешить использование двоичных целочисленных констант» (PDF) . open-std.org . 2020-07-30. Архивировано (PDF) из оригинала 22 декабря 2022 г.
- ^ «WG14-N2626: Разделители цифр» (PDF) . open-std.org . 2020-12-15. Архивировано (PDF) из оригинала 19 декабря 2022 г.
- ^ «WG14-N3030: Улучшения в перечислениях» . open-std.org . 19 июля 2022 г. Архивировано из оригинала 26 ноября 2022 года.
- ^ «WG14-N3029: Улучшенные обычные перечисления» . open-std.org . 19 июля 2022 г. Архивировано из оригинала 29 января 2023 года.
- ^ «WG14-N2935: Сделайте ложные и истинные первоклассные языковые функции» (PDF) . open-std.org . 15 февраля 2022 г. Архивировано (PDF) из оригинала 21 ноября 2022 г.
- ^ «WG14-N2934: Исправьте написание ключевых слов» (PDF) . open-std.org . 15 февраля 2022 г. Архивировано (PDF) из оригинала 24 декабря 2022 г.
- ^ «WG14-N2508: Свободное расположение меток внутри составных операторов» (PDF) . open-std.org . 2020-03-28. Архивировано (PDF) из оригинала 27 декабря 2022 г.
- ^ «WG14-N2510: Разрешение безымянных параметров в определении функции» (PDF) . open-std.org . 09.04.2020. Архивировано (PDF) из оригинала 24 декабря 2022 г.
- ^ «WG14-N2900: последовательная, интуитивно понятная инициализация без предупреждений с помощью {}» . open-std.org . 01.01.2022. Архивировано из оригинала 27 декабря 2022 года.
- ^ «WG14-N2975: Ослабьте требования к спискам переменных параметров» (PDF) . open-std.org . 15 апреля 2022 г. Архивировано (PDF) из оригинала 28 ноября 2022 г.
- ^ «WG14-N2335: Атрибуты в C» (PDF) . open-std.org . 09.03.2019. Архивировано (PDF) из оригинала 26 октября 2022 г.
- ^ Jump up to: а б «Непоследовательные функции» . open-std.org . Проверено 18 июля 2024 г.
- ^ «WG14-N2265: Гармонизация static_assert с C++» (PDF) . open-std.org . 06.07.2018. Архивировано (PDF) из оригинала 28 марта 2023 г.
- ^ «Метки в конце составных операторов (совместимость с C)» (PDF) . 13 января 2022 г.
- ^ «WG14-N2554: Небольшие исправления формулировок атрибутов» (PDF) . open-std.org . 04.08.2020. Архивировано (PDF) из оригинала 28 ноября 2022 г.
- ^ «WG14-N2334: устаревший атрибут» (PDF) . open-std.org . 22 января 2019 г. Архивировано (PDF) из оригинала 19 октября 2022 г.
- ^ «WG14-N2408: Атрибут провала» (PDF) . open-std.org . 11.08.2019. Архивировано (PDF) из оригинала 25 декабря 2022 г.
- ^ «WG14-N2270: Атрибут may_unused» (PDF) . open-std.org . 06.07.2018. Архивировано (PDF) из оригинала 25 декабря 2022 г.
- ^ «WG14-N2267: Атрибут nodiscard» (PDF) . open-std.org . 06.07.2018. Архивировано (PDF) из оригинала 19 октября 2022 г.
- ^ «WG14-N2764: Атрибут noreturn» (PDF) . open-std.org . 21 июня 2021 г. Архивировано (PDF) из оригинала 25 декабря 2022 г.
- ^ «WG14-N2557: Разрешить дублирование атрибутов» (PDF) . open-std.org . 01.09.2020. Архивировано (PDF) из оригинала 28 ноября 2022 г.
- ^ «WG14-N2418: Добавление префикса символов u8» (PDF) . open-std.org . 2019-09-02. Архивировано (PDF) из оригинала 13 января 2023 г.
- ^ В чем смысл символьных литералов UTF-8, предложенных для C++17?; Переполнение стека.
- ^ «WG14-N2341: ISO/IEC TS 18661-2 — Расширения с плавающей запятой для C — Часть 2: Десятичная арифметика с плавающей запятой» (PDF) . open-std.org . 26 февраля 2019 г. Архивировано (PDF) из оригинала 21 ноября 2022 г.
- ^ «WG14-N2601: Приложение X — взаимозаменяемые и расширенные типы IEC 60559» (PDF) . open-std.org . 15 октября 2020 г. Архивировано (PDF) из оригинала 14 октября 2022 г.
- ^ «WG14-N3018: Спецификатор constexpr для определений объектов» . open-std.org . 06.07.2022. Архивировано из оригинала 24 декабря 2022 года.
- ^ «WG14-N2653: char8_t: тип символов и строк UTF-8 (версия 1)» . open-std.org . 04.06.2021. Архивировано из оригинала 27 мая 2023 года.
- ^ «WG14-N2728: строковые литералы char16_t и char32_t должны иметь формат UTF-16 и UTF-32» . open-std.org . 15 мая 2021 г. Архивировано из оригинала 27 мая 2023 года.
- ^ «WG14-N3038: Введение спецификаторов класса хранения для составных литералов» . open-std.org . 21 июля 2022 г. Архивировано из оригинала 26 ноября 2022 года.
- ^ «WG14-N2940: Удаление триграфов??!» (PDF) . open-std.org . 2022-03-02. Архивировано (PDF) из оригинала 26 октября 2022 г.
- ^ «WG14-N2432: Удалить поддержку определений функций с предложением списков идентификаторов» (PDF) . open-std.org . 25 сентября 2019 г. Архивировано (PDF) из оригинала 27 декабря 2022 г.
- ^ «WG14-N2841: Никаких деклараторов функций без прототипов» . open-std.org . 10.10.2021. Архивировано из оригинала 12 ноября 2022 года.
- ^ «WG14-N2412: Представление знака дополнения до двух» (PDF) . open-std.org . 11 августа 2019 г. Архивировано (PDF) из оригинала 27 декабря 2022 г.
- ^ «WG14-N2993: Сделать *_HAS_SUBNORM устаревшим» . open-std.org . 06.06.2022. Архивировано из оригинала 5 декабря 2022 года.
- ^ «Примечания к выпуску GCC 9» . Проект ГНУ . Архивировано из оригинала 27 декабря 2022 года.
- ^ «Clang 9.0 — добавлен новый языковой режим для C2x» . Репозиторий проектов LLVM . 14 мая 2019 г. Архивировано из оригинала 27 декабря 2022 г.
- ^ «Пеллес С – существенные изменения между 10.00 и 11.00» . smorgasbordet.com . Архивировано из оригинала 27 декабря 2022 года.
Дальнейшее чтение
[ редактировать ]- N3096 (рабочий проект стандарта C23); РГ14; Апрель 2023 г. (скачать бесплатно)
- N3149 (рабочий проект стандарта C23); РГ14; Июль 2023 г. (недоступно для общественности)
- N3219 ( проект DIS ISO/IEC 9899:2023 ); РГ14; Февраль 2024 г. (проект ISO доступен, но не бесплатно)
- ISO/IEC 9899:2024 (официальный стандарт C23); ИСО ; 2024 г. (планируется к выпуску в 2024 г.)
Внешние ссылки
[ редактировать ]- Репозиторий документов WG14
- Заседания WG14 – повестка дня и протоколы
- Уставы WG14: Устав C2x , Устав C23 , Интерпретация Устава C23 , Стандартный устав C