GCC 15 будет использовать стандарт C23 по умолчанию
В кодовую базу, на основе которой формируется запланированный на весну следующего года выпуск набора компиляторов 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.
Источник: http://www.opennet.ru/opennews/art.shtml? num=62278
© OpenNet