The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

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

23.11.2024 21:20

В кодовую базу, на основе которой формируется запланированный на весну следующего года выпуск набора компиляторов 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.


  1. Главная ссылка к новости (https://www.phoronix.com/news/...)
  2. OpenNews: Релиз набора компиляторов GCC 14
  3. OpenNews: Релиз набора компиляторов GCC 13
  4. OpenNews: Опубликован набор компиляторов LLVM 19
Лицензия: CC BY 3.0
Наводку на новость прислал Аноним
Короткая ссылка: https://opennet.ru/62278-gcc
Ключевые слова: gcc
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (64) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.1, ДаНуНафиг (?), 21:46, 23/11/2024 [ответить] [﹢﹢﹢] [ · · · ]  
  • +10 +/
    Ну надо же, bool/true/false подвезли! Я дожил до этого момента!
     
     
  • 2.8, Аноним (8), 22:32, 23/11/2024 [^] [^^] [^^^] [ответить]  
  • +4 +/
    А те, кому реально это было нужно — не ждали и использовали <stdbool.h>, начиная с C99…
     
     
  • 3.68, Анон28679234 (?), 02:39, 24/11/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Вообще довольно странно рассуждать о примитивных типах как о "реально нужных" или ненужных
    При определенной степени ментальных упражнений можно даже ассемблер называть синтаксическим сахаром для электроцепи, однако я не вижу очереди желающих написать себе сайт с помощью паяльника
     
  • 2.19, YetAnotherOnanym (ok), 23:27, 23/11/2024 [^] [^^] [^^^] [ответить]  
  • –3 +/
    Бедненький! Как же ты жил без этой ложечки сахара?
     
     
  • 3.23, Аноним (23), 23:43, 23/11/2024 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Возможно, до этого момента он не программировал вообще. А теперь пенсия на горизонте, и кто, кроме него, будет охранять пятёрочку на раЁне?
     
  • 3.24, Аноним (24), 23:44, 23/11/2024 [^] [^^] [^^^] [ответить]  
  • +/
    > ложечки сахара?

    ну вот "синтаксический диабет", уже ампутировали "Удалена возможность определения функций в стиле K&R C,".

     
  • 2.72, Аноним (-), 03:35, 24/11/2024 [^] [^^] [^^^] [ответить]  
  • +/
    >  Ну надо же, bool/true/false подвезли! Я дожил до этого момента!

    Это еще что! Как тебе такое Элон Маск?!
    > Появилась поддержка использования спецификатора constexpr для определения объектов.

    А вот тут...
    >  Добавлена поддержка префиксов "0b" и "0B" для указания целых значений в двоичной форме

    ...всем микроконтроллерщикам радоваться полчаса!

     

  • 1.2, Аноним (2), 21:58, 23/11/2024 Скрыто ботом-модератором [﹢﹢﹢] [ · · · ]     [к модератору]
  • +2 +/
     

     ....ответы скрыты (7)

  • 1.6, Аноним (6), 22:25, 23/11/2024 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    >Структуры, объединения и перечисления разрешено определять более одного раза в одной области видимости с одним и тем же содержимым и повторяющимся тегом.

    а это зачем?

     
     
  • 2.9, bircoph (ok), 22:35, 23/11/2024 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Чтоб меньше конфликтов было при всяких #include и inline.
     
     
  • 3.17, Аноним (6), 23:23, 23/11/2024 [^] [^^] [^^^] [ответить]  
  • –3 +/
    > Чтоб меньше конфликтов было при всяких #include и inline.

    И как 50 лет жили без этого.

     
     
  • 4.32, Аноним (32), 00:14, 24/11/2024 [^] [^^] [^^^] [ответить]  
  • +3 +/
    С матами и постоянными переименованиями всего и вся лишь бы этот комп-депилятор перестал жаловаться, а уже начал комп-депилировать.
     
     
  • 5.67, Аноним (67), 02:24, 24/11/2024 Скрыто ботом-модератором     [к модератору]
  • +/
     
  • 4.39, Аноним (39), 00:25, 24/11/2024 [^] [^^] [^^^] [ответить]  
  • +3 +/
    Жили же тысячи лет в пещерах и ничего.
     

  • 1.7, Аноним (7), 22:30, 23/11/2024 [ответить] [﹢﹢﹢] [ · · · ]  
  • +3 +/
    > Вызов функции realloc() с нулевым размером переведён в разряд неопределённого поведения.

    Нужно больше неопределённого поведения! Потом, когда вылезут очередные уязвимости из-за работы с памятью, можно будет с уверенностью утверждать, что где-то ещё оптимизатор смог ускорить работу на 0.01% благодаря этому!

     
     
  • 2.11, Аноним (11), 22:41, 23/11/2024 [^] [^^] [^^^] [ответить]  
  • +5 +/
    Ничего удивительного, в этом языке даже int + int является неопределенным поведением. Нам в 2024 ясно видна дикость этого, а вот палео-кодерам из палео-70-ых это казалось нормальной идеей.
     
     
  • 3.28, Аноним (23), 00:06, 24/11/2024 [^] [^^] [^^^] [ответить]  
  • –1 +/
    > int + int является неопределенным поведением

    Воо, это вообще лютая дичь, я до сих пор не понимаю, КАК такое возможно в языке для системного программирования.

     
     
  • 4.29, Аноним (23), 00:08, 24/11/2024 [^] [^^] [^^^] [ответить]  
  • +/
    П.с. а еще больше недоумеваю от тех УМВРщиков, которые в упор это не замечают.
     
     
  • 5.33, Аноним (32), 00:16, 24/11/2024 [^] [^^] [^^^] [ответить]  
  • +4 +/
    Потому что системный язык должен полагаться на то как происходит сложение на аппаратном уровне в конкретной системе, а не воротить абстракцию над абстракцией лишь бы все было везде одинаково. Кому надо одинаково идут на джаваскрипт зачем им Си?
     
     
  • 6.44, Аноним (-), 00:41, 24/11/2024 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > Потому что системный язык должен полагаться на то как происходит сложение на
    > аппаратном уровне в конкретной системе, а не воротить абстракцию над абстракцией
    > лишь бы все было везде одинаково. Кому надо одинаково идут на
    > джаваскрипт зачем им Си?

    Вон то на практике вело к дохреналиону багов, увы и ах. А абстракции что, как вон то алго не считай, а если ему надо не менее 32 битов для корректной работы - то хоть ты тресни, но ты или дашь эти 32 бита, или профачишь вычисления. В ряде случаев еще и с вулнами, отрицательными индексами массивов и прочими характерными факапами. И спасибо еще если это дамп памяти по сети или в эфир улетит. А то бывает и такое, heartbleed соврать не даст.

     
     
  • 7.48, mister_0 (?), 00:47, 24/11/2024 [^] [^^] [^^^] [ответить]  
  • +1 +/
    int a + int b <= int max

    из этого условия можно вывести weakest predicate и проверить его до сложения

    int max - int a => int b

    если это условие не работает, то складывать не надо, будет страшный оверфлоу.

    один if и тот сделать не могут, подавай им сразу новый язык, бороу чекер, безразмерную арифметику и прочее.

     
     
  • 8.55, Аноним (55), 01:11, 24/11/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Да, но 1 Это лишняя операция 2 Половина долбоклюев это забудет 3 На прак... текст свёрнут, показать
     
     
  • 9.62, mister_0 (?), 01:58, 24/11/2024 [^] [^^] [^^^] [ответить]  
  • +/
    у тебя есть процессор и три регистра по 32 бита ты загрузил в один регистр A 0x1... текст свёрнут, показать
     
  • 8.56, Аноним (-), 01:16, 24/11/2024 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Если значение int a отрицательное, будет переполнение при вычитание underflow... текст свёрнут, показать
     
     
  • 9.59, mister_0 (?), 01:33, 24/11/2024 [^] [^^] [^^^] [ответить]  
  • +/
    несомненно для отрицательных чисел нужно использовать min int, а ещё конечно не ... текст свёрнут, показать
     
     
  • 10.64, Аноним (64), 02:17, 24/11/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Вместо дорогой пред-проверки с явными сравнениями и несколькими ветками можно бы... текст свёрнут, показать
     
  • 6.46, Аноним (-), 00:45, 24/11/2024 [^] [^^] [^^^] [ответить]  
  • +/
    > Потому что системный язык должен полагаться на то как происходит сложение
    > на аппаратном уровне в конкретной системе

    Угу, именно поэтому они это не implementation-defined, не хотя бы unspecified, а вот сразу UB!
    Что бы когда ты писал код, то как он будет работать было именно ХЗ, в зависимости от платформы, железа, флагов, степени безумия разраба компилятора, которые может просто выкинуть твой код нафиг с обоснование "не, ну не бывает же UB в нормальном коде".

     
     
  • 7.54, анон (?), 01:10, 24/11/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Такова плата за генерацию эффективного кода. Никто же не заставляет использовать именно Си
     
     
  • 8.69, Аноним (-), 02:50, 24/11/2024 Скрыто ботом-модератором     [к модератору]
  • +/
     
  • 6.47, Аноним (-), 00:46, 24/11/2024 Скрыто ботом-модератором     [к модератору]
  • +/
     
  • 3.42, mister_0 (?), 00:37, 24/11/2024 [^] [^^] [^^^] [ответить]  
  • +/
    ну так ты проверь перед сложением или можешь после сложения в регистр flags посмотреть, там есть бит переполнения.

    а ещё есть люди которые рапэраунд с оверфлоу путают

     
     
  • 4.49, Аноним (24), 00:48, 24/11/2024 [^] [^^] [^^^] [ответить]  
  • +/
    > или можешь после сложения в регистр flags посмотреть

    в С?

     
     
  • 5.50, mister_0 (?), 00:53, 24/11/2024 [^] [^^] [^^^] [ответить]  
  • +/
    ну придётся ассемблерную вставку сделать.
     
     
  • 6.53, Аноним (-), 01:04, 24/11/2024 Скрыто ботом-модератором     [к модератору]
  • +/
     
  • 5.51, mister_0 (?), 00:55, 24/11/2024 [^] [^^] [^^^] [ответить]  
  • +/
    но я выше ответил, что проще считать post condition выводить weakest predicate и проверять его до вызова и никаких тебе оверфлоу.

    или ты думаешь, что только использования раста и питона это единственный способ?

     
     
  • 6.65, Аноним (64), 02:19, 24/11/2024 [^] [^^] [^^^] [ответить]  
  • +/
    > или ты думаешь, что только использования раста и питона это единственный способ?

    Скажем так, единственный способ - это не использование С.

     
  • 4.52, Аноним (-), 01:04, 24/11/2024 [^] [^^] [^^^] [ответить]  
  • +/
    > ну так ты проверь перед сложением или можешь после сложения в регистр
    > flags посмотреть, там есть бит переполнения.

    В сях нет стандартного способа посмотерть флаги, внезапно.

    > а ещё есть люди которые рапэраунд с оверфлоу путают

    Wrapround определен и гарантирован только для unsigned, если что.

     

  • 1.12, Аноним (12), 22:46, 23/11/2024 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Значит ли это, что gcc 15 будет поддерживать стандарт c23 ПОЛНОСТЬЮ?
     

     ....ответы скрыты (2)

  • 1.15, Маковод (?), 23:02, 23/11/2024 [ответить] [﹢﹢﹢] [ · · · ]  
  • +2 +/
    Всё это ерунда, есть же православный ANSI C (C89). Всё остальное — ненужный реверс инжиниринг с синтаксическим сахаром.
     
     
  • 2.16, Маковод (?), 23:03, 23/11/2024 [^] [^^] [^^^] [ответить]  
  • +3 +/
    Овер инжиниринг* (будь проклята автозамена)
     
     
  • 3.34, Аноним (32), 00:19, 24/11/2024 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Сахар это язык zig. Си это та ложка дегтя.
     
  • 2.41, Аноним (-), 00:34, 24/11/2024 [^] [^^] [^^^] [ответить]  
  • +2 +/
    > Всё это ерунда, есть же православный ANSI C (C89). Всё остальное —
    > ненужный реверс инжиниринг с синтаксическим сахаром.

    Вот ты на нем и прогай. А я меньше чем на C99 в принципе не согласен, а лучше минимум 11, ибо делать из г-на и палок аналог static assert'а - ну такое себе.

     

  • 1.18, nc (ok), 23:26, 23/11/2024 [ответить] [﹢﹢﹢] [ · · · ]  
  • –2 +/
    Расширения GNU давно пора принимать в стандарты С и С++. Простые и полезные идеи, уже давно реализованные и многократно проверенные.
    Единственное чего не хватает - расширения __declspec(property) в С++, которое есть в msvc и clang, но нет в gcc.
     
     
  • 2.25, Аноним (23), 23:46, 23/11/2024 [^] [^^] [^^^] [ответить]  
  • –2 +/
    > Расширения GNU нужно гнaть отовсюду сcaными тpяпками, как и всю идеологию GNU.

    Подправил, благодарить не обязательно.

     
     
  • 3.36, Аноним (32), 00:21, 24/11/2024 Скрыто ботом-модератором     [к модератору]
  • +1 +/
     

  • 1.38, Аноним (-), 00:23, 24/11/2024 Скрыто ботом-модератором [﹢﹢﹢] [ · · · ]     [к модератору]
  • +/
     
  • 1.40, Аноним (-), 00:31, 24/11/2024 Скрыто ботом-модератором [﹢﹢﹢] [ · · · ]     [к модератору]
  • +/
     
  • 1.45, Аноним (45), 00:42, 24/11/2024 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Хаипутики ничего нету кроме 11 и 99 версии , очередная обертка
     
     
  • 2.57, анон (?), 01:20, 24/11/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Можешь раскрыть свою мысль, а то, ведь, не понятно чего сказать хотел?
     
     
  • 3.61, Кексперт (?), 01:49, 24/11/2024 [^] [^^] [^^^] [ответить]  
  • +/
    Собирайте свои программы 99 версией они будут работать на 35% быстрее , но не 11-ой версии для иос это наказ от главного создателя именно этой ос , у него пока идёт разборка с банками.
     

  • 1.58, Аноним (58), 01:20, 24/11/2024 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    14 версия при сборке пакетов ругалась на указатели, 15 будет ругаться если код не той версии. Страшно представить на что 16 версия ругаться будет.
     
  • 1.60, anonymous (??), 01:38, 24/11/2024 Скрыто ботом-модератором [﹢﹢﹢] [ · · · ]     [к модератору]
  • –1 +/
     
  • 1.63, Аноним (63), 02:01, 24/11/2024 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Лишь бы С++ не использовать.
     
  • 1.70, мяв (?), 02:59, 24/11/2024 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    что-то фигня какая-то с auto..
    auto myNum = superCalculator(2,2);
    и иди гадай, кого там возвращает твоя функция.
    а потом твой друг пойдет гадать и лазать в соседнем файле, когда откроет код .. псоле чего окажется, что эту фцнкцию где-то там по дороге перекрыли/перепилили/вовсе другой файл включили и она тперь возвращает int, вместо uint :|
    зачем вообще такое добавлять в язык со сторой типизацией?
    ну, серьезно, это ж лол какой-то.
    послезавтра эта функция будет char* возвращать. и я, вместо жалобы на неправельный тип в декларации, увижу 100500 жалоб в черт пойми, каких частях кода.
    а auto молча станет char*.
     
     
  • 2.71, мяв (?), 03:00, 24/11/2024 [^] [^^] [^^^] [ответить]  
  • +/
    я ж правильно логику работы auto поняла?
     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру