Первый предварительный вариант новой редакции стандарта Си, получившей рабочее название C2x, опубликован для обсуждения.
Большинство изменений, одобренных на сегодня для C2x, — это не новые функции, а уточнения и усовершенствования особенностей поведения Си в различных реализациях. Назначение приоритета доработкам — это уже традиция: аналогичным образом происходило развитие ревизии C11 и последней на сегодня редакции стандарта, C17.
Согласно описанию C2x, при дальнейшей разработке Си планируется делать строгий акцент на сохранении совместимости с существующим обширным корпусом кода на этом языке, а также избегать «тихих» изменений — таких, которые меняют поведение программы, написанной на Си прежних версий. Если такое изменение все же необходимо, это должно быть явно указано в стандарте.
WG14, рабочая группа, контролирующая развитие стандарта Си (ISO/IEC 9899), на сегодня формально одобрила лишь небольшое количество изменений по сравнению с C17. Перечислим наиболее заметные из них.
Уточнение для ключевого слова restrict, которое применяется, чтобы сообщить компилятору, что объявляемый указатель — единственный, указывающий на конкретный объект в памяти. В C2x будут приведены более подробные примеры, иллюстрирующие поведение restrict, чтобы предотвратить выполнение компиляторами небезопасных или ненужных оптимизаций.
Приведение действия проверочного утверждения static_assert в Си в соответствие с C++. Данное утверждение используется для проверки действительности константных выражений на этапе компиляции. Эта возможность присутствует в обоих языках, но реализована по-разному. В C2x static_assert будет вести себя так же, как и в C++, чтобы обеспечить возможность переноса кода заголовков между двумя языками и упростить «перевод» с одного на другой.
Уточненные описания поведения объединений. В различных реализациях Си анонимные объединения, появившиеся в C11, ведут себя по-разному. Уточнения в C2x обещают единство поведения независимо от реализации.
Другие перемены касаются обработки деления на ноль при использовании функции pow(), форматов оценки чисел с плавающей запятой и уточнений, касающихся преобразования символов в многобайтовых кодировках.
На Си разрабатывается множество популярных программных проектов, в том числе ядро Linux. Сейчас в рейтинге Tiobe Си занимает второе по популярности место. Благодаря простоте Си обычно выбирают для создания приложений, выполняемых непосредственно на аппаратных платформах или близко к аппаратному уровню, однако при использовании Си нужно прилагать больше усилий по управлению памятью по сравнению с языками более высокого уровня наподобие Python. Ошибки управления памятью — самая распространенная проблема программ на Си.
В предыдущих редакциях стандарта Си появились функции, помогающие с управлением памятью, в том числе механизм проверки границ Annex K. Однако в C2x интерфейсы Annex K предлагаются к удалению или объявлению устаревшими, поскольку большинство их реализаций неполны, не соответствуют стандарту и непереносимы. Есть альтернативные предложения, например, заменить эти API на сторонние системы проверки границ наподобие Valgrind или Intel Pointer Checker, доработать модель памяти или ввести новые способы проверки границ для объектов памяти.
Помимо доработок официального стандарта существуют самостоятельные проекты, призванные упростить использование Си. Например, расширение Microsoft Checked C вводит проверки, предотвращающие многие распространенные ошибки управления памятью. Йенс Густедт, один из ведущих разработчиков стандарта Си, предлагает проект Modular C, в рамках которого Си получает систему модулей, как в языках более высокого уровня.
Формирование списка изменений для C2x займет еще не меньше двух лет. В WG14 планируют подготовить пересмотренный стандарт к концу 2021 года, а в 2022-м — опубликовать окончательный вариант.