GCC 15 ще използва стандарт C23 по подразбиране

В кодовата база, на основата на която се формулира планираното за пролетта на следващата година издание на комплекта компилатори 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]] позволява да се укаже, че функцията не връща стойности (заглавният файл stdnoreturn.h и спецификаторът «_Noreturn» са обявени за остарели).
  • Подкрепа за синтаксиса u8» за определяне на константи със символи в UTF-8.
  • Добавен е типът char8_t за низове и символи в кодировката UTF-8, както и функции за преобразуване на низове с многобайтови символи mbrtoc8() и c8rtomb().
  • Променено е действието на ключовата дума «auto», която сега води до извеждане на типа при определянето на обекти, което позволява използване на спецификатора «auto» вместо тип за определяне на типа на променливите на базата на типа на израза за тяхната инициализация. Например: «auto y = cos(x);».
  • Функциите с празен списък от аргументи сега се обработват като функции, които не приемат аргументи.
  • Добавена поддръжка на заглавни файлове и с макроси, функции и типове за проверка на целичислени изчисления.
  • Позволено е разполагането на преходни етикети на всякакви места в съставни изрази.
  • Поддръжката на триграфи е прекратена в кода, последователности от три 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

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster