Тут готовится новый стандарт C - C2X (X, поскольку неизвестно, когда именно его выпустят).
Из интересный фичей, что точно в него войдут:
Функции strdup и
stdndup - внезапно, их не было в стандартной либе.
Атрибуты - ура, наконец-то будет единый красивый способ задавать атрибуты переменным вместо уродских
__attribute__ и
__declspec.
Выглядеть будет примерно так:
[[attr1]] struct [[attr2]] S { } [[attr3]] s1 [[attr4]], s2 [[attr5]];. Здесь attr1 относится к идентификаторам s1 и s2, attr2 относится к определению struct S, attr3 — к типу struct s1, attr4 — к идентификатору s1, attr5 — к идентификатору s2.
Из уже предложенных атрибутов: deprecated, fallthrough для использования в свичах, nodiscard, maybe_unused, noreturn.
Запретят K&R (объявление типов после "скобочек") способ указания аргументов функий. Больше нельзя будет сделать так:
long maxl (a, b) long a, b; {return ...;}.
Знаковые целые числа
будут всегда считаться представленными дополнительным кодом.
Также есть ряд предложений, которые коммитет еще не принял, но они находятся в работе и скорее всего будут приняты:
Включение бинарных блобов сразу в исполняемый файл без танцев с бубном!
const int music[] = {
#embed int "music.wav"
};
Добавятся ключевые слова true, false, и
заменятся alignas, alignof, bool, thread_local, static_assert вместо их же вариантов, но с нижним подчеркиванием в начале.
Можно будет задавать функции с безымянными параметрами:
int main(int, char *[]) { return 0; }
Добавление полноценного nullptr, эквивалентного
((void*)0), и при приведении типов остающегося указателем.
Большая реформа обработки ошибок в стандартной либе. Предлагается из функции-шаблона генерировать четыре варианта функции, каждый из которых будет использоваться на усмотрение компилятора в зависимости от того, как её используется програмист.
И, наконец, пара изменений, которые не оформлены в предложения, однако члены комитета
намелаки, что работа над ними ведется:
Вынос оператора typeof в стандарт, а не частные реализации в компиляторах.
И оператор defer, копирующая ключевое слово из Go, позволяющий выполнять какие-то действия по окончанию области видимости переменной.
Формально, некоторые компиляторы уже поддерживают такой атрибут (
__attribute__((cleanup(free))) char *s = malloc(sizeof(*s));), но в стандарте о такой возможности ничего не говорилось.
Подробней - в оригинальной статье на
хабре.