В кодовата база, на основата на която ще се изготви планираното за пролетта на следващата година издание на пакета компилатори GCC 15, е прието изменение, което включва по подразбиране използването на стандарта C23 с разширения GNU («-std=gnu23») при компилирането на програми на езика C (по-рано по подразбиране се използваше стандартът C17 — «-std=gnu17»). Изменението потенциално може да доведе до проблеми при изграждането на съществуващи проекти, тъй като в новия стандарт има разлики, като добавяне на константата nullptr, типа _BitInt(n) и ключовите думи bool, true и false, които могат да конфликтуват с определените в приложенията идентификатори със същите имена.
Стандартът C23 (ISO/IEC 9899:2024) беше официално публикуван от международната организация по стандартизация (ISO) на 31 октомври 2024 година. Сред промените в новия стандарт:
- Премахната е възможността за определяне на функции в стил K&R C, използван до прилагането на спецификацията ANSI C и описан в книгата «The C Programming Language» на Керниган и Ритчи. Стилът K&R предполага описание на типовете аргументи след определянето на функцията, например, «int add(a, b) int a, b; {}».
- Неименуваните параметри на функциите — необязателност за указване на имената на неизползваните параметри при определянето на функции (както в C++). Например, сега можете да пишете «int f(int, int) { return 7; }».
- Поддръжка на синтаксиса «[[име]]» за определяне на атрибути, както в C++ («[[gnu::const]]», «[[deprecated]]», «[[fallthrough]]», «[[maybe_unused]]», «[[nodiscard]]», «[[noreturn]]», «[[reproducible]]», «[[unsequenced]]»). Например, атрибутът [[noreturn]] позволява да se указва, че функцията не връща стойности (заглавният файл stdnoreturn.h и спецификаторът «_Noreturn» са обявени за остарели).
- Поддръжка на синтаксиса u8» за определяне на константи със символи в UTF-8.
- Добавен е типът char8_t за низове и символи в кодировката UTF-8, а също и функции за преобразуване на низове с многобайтови символи mbrtoc8() и c8rtomb().
- Променено е действието на ключовата дума «auto», която сега води до извод на тип при определяне на обекти, което позволява използването на признака «auto» вместо тип за определяне на типа на променливите въз основа на типа на израза за тяхното инициализиране. Например: «auto y = cos(x);».
- Функциите с празен списък от аргументи сега се обработват като функции, които не приемат аргументи.
- Добавена е поддръжка на заглавни файлове <stdckdint.h> и <stdbit.h> с макроси, функции и типове за проверка на цели числови пресмятания.
- Разрешено е поставянето на преходни етикети на произволни места в съставни изрази.
- Поддръжката на триграфи в кода е прекратена. Последователности от три ASCII символа, обработвани като един символ, например последователността «??=», могат да се използват вместо «#». След появата на Unicode поддръжката на триграфи е загубила смисъл.
- Добавена е поддръжка на префикси «0b» и «0B» за указване на целочислени стойности в двоичен формат, например «int b = 0b101010».
- Добавени са ключовите думи bool, static_assert, alignas, alignof и thread_local.
- Разрешено е задаването на празни скоби «{}» за инициализиране на нулеви стойности, т.е. вече може да се пише «struct S { int x, y } s = {};».
- Предоставена е възможност за указване на всякакви универсални имена на символи в символни и стрингови литерали. Например, «int \u0024 = 0;».
- В «stddef.h» е добавен макрос «unreachable».
- Добавен е нов тип nullptr_t и константа nullptr за определяне на нулеви указатели, които могат да се конвертират в всеки тип указатели и да представят вариант NULL, който не е свързан с цели числови типове и тип void*. Например, може да се указва «void func(nullptr_t); func(0); func((void *)0);».
- Добавени са типовете «_BitInt (N)» и «unsigned _BitInt (N)» за определяне на цели числа с определен брой битове, както и десетични типове с плаваща запетая «_Decimal32», «_Decimal64» и «_Decimal128» и функции за работа с подобни типове.
- Добавена е възможността за използване на символа «‘» за ясно разделяне на разрядите в числата (например, «1’000’000»).
- Структури, обединения и изброявания могат да се определят повече от веднъж в една и съща видимост с едно и също съдържание и повтарящ се етикет.
- В стандарт са включени оператори typeof и typeof_unqual.
- Появила се е поддръжка за използването на спецификатора constexpr за определяне на обекти.
- В заглавните файлове float.h и math.h са добавени макросите INFINITY, NAN, FLT_NORM_MAX, DBL_NORM_MAX и LDBL_NORM_MAX.
- Добавени са директиви на преобработвача #elifdef, #elifndef, #warning и #embed. «#embed» е предназначен за интегриране на бинарни ресурси.
- Упрощено е използването на списъци с променлив брой аргументи (variadic).
- Разширени са възможностите на изброяванията (enum).
- Добавена е поддръжката на заместване на «%b» за обработка на двоични стойности в семействата функции printf() и scanf().
- Викът на функцията realloc() с нулев размер е преобразуван в категория на неопределено поведение.
- Стандартизирани са функциите memccpy(), strdup(), strndup(), gmtime_r() и localtime_r().
- Функциите asctime() и ctime() са обявени за остарели.
- Макросите static_assert и thread_local са преместени в категорията ключови думи.
Източник: opennet.ru
