GCC 15 будет использовать стандарт C23 по умолчанию

Новости мира unix. Хотите узнать секрет вечного счастья? Откройте страницу 246.
Ответить
acolyte
Аватара пользователя
Сообщения: 3639
Зарегистрирован: 20.08.2022

#

GCC 15 будет использовать стандарт C23 по умолчанию
Дата публикации:Sat, 23 Nov 2024 21:20:46 +0300




В кодовую базу, на основе которой формируется запланированный на весну следующего года выпуск набора компиляторов GCC 15, принято изменение, включающее по умолчанию использование стандарта С23 с расширениями GNU ("-std=gnu23") при компиляции программ на языке C (ранее по умолчанию использовался стандарт C17 - "-std=gnu17"). Изменение потенциально может привести к проблемам при сборке существующих проектов, так как в новом стандарте имеются отличия, такие как добавление константы nullptr, типа _BitInt(n) и ключевых слов bool, true и false, которые могут конфликтовать с заданными в приложениях одноимёнными идентификаторами.




Стандарт С23 (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; }".

    Поддержка синтаксиса "[[имя]]" для определения атрибутов как в С++ ("[[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);".

    Функции с пустым списком аргументов теперь обрабатываются как функции, не принимающие аргументы.
    Добавлена поддержка заголовочных файлов <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
Ссылка на оригинал: https://www.opennet.ru/opennews/art.shtml?num=62278

Жизнь за Нер'зула!

Ответить