Разница между c99 и c11

Я учусь с, в настоящее время. Книга, которую я прочитал, основана на C99. Я хочу обновить свои знания до C11 после окончания этой книги или изменить ресурс, если есть существенная разница. Таким образом, я прошу объяснение или ресурс для обновления моих знаний. Я нашел только этот источник. Тем не менее, он не охватывает ту информацию, которая мне нужна или не является краткой.

Заранее спасибо. П.С.: Я хочу изучать C11, так как считаю, что сейчас это распространенный стандарт. Если нет, пожалуйста, сообщите мне.

Ответ 1

Хорошие обзоры стандарта C11:

Стандарт включает несколько изменений в спецификации языка и библиотеки C99, таких как:

  • Спецификация выравнивания (спецификатор _Alignas, оператор _Alignof, функция aligned_alloc, файл заголовка <stdalign.h>)
  • Спецификатор функции _Noreturn и заголовочный файл <stdnoreturn.h>
  • Типовые универсальные выражения с использованием ключевого слова _Generic. Например, следующий макрос cbrt(x) преобразуется в cbrtl(x), cbrt(x) или cbrtf(x) в зависимости от типа x:

    #define cbrt(x) _Generic((x), long double: cbrtl, \
                              default: cbrt, \
                              float: cbrtf)(x)
    
  • Поддержка многопоточности (спецификатор класса хранения _Thread_local, заголовок <threads.h>, включая функции создания/управления потоками, мьютекс, переменную условия и специфичные для потока функции хранения, а также спецификатор типа _Atomic и <stdatomic.h> для источника бесперебойного питания). доступ к объекту).

  • Улучшенная поддержка Unicode на основе Технического отчета Unicode C ISO/IEC TR 19769: 2004 (типы char16_t и char32_t для хранения закодированных данных UTF-16/UTF-32, включая функции преобразования в <uchar.h> и соответствующие строковые литералы u и U строковых префиксов а также префикс u8 для литералов, закодированных в UTF-8).
  • Удаление функции gets, которая устарела в предыдущей редакции стандарта языка C, ISO/IEC 9899: 1999/Cor.3: 2007 (E), в пользу новой безопасной альтернативы, gets_s.
  • Интерфейсы проверки границ (Приложение K).
  • Функции анализируемости (Приложение L).
  • Дополнительные макросы для запроса характеристик типов с плавающей запятой, касающихся субнормальных чисел с плавающей запятой и количества десятичных цифр, которые может хранить тип.
  • Анонимные структуры и объединения, полезны, когда объединения и структуры вложены, например, в struct T { int tag; union { float x; int n; }; };.
  • Статические утверждения, которые оцениваются во время перевода на более поздней стадии, чем #if и #error, когда типы понимаются переводчиком.
  • Эксклюзивный режим создания и открытия (суффикс "…x") для open. Это ведет себя как O_CREAT|O_EXCL в POSIX, который обычно используется для блокировки файлов.
  • Функция quick_exit является третьим способом завершения программы, предназначенным для выполнения по меньшей мере минимальной деинициализации в случае сбоя завершения с помощью exit.
  • Макросы для построения комплексных значений (частично потому, что real + imaginary*I может не дать ожидаемого значения, если imaginary бесконечно или NaN).

Ответ 2

В C 2011 standard, вот основные изменения с C99:

Предисловие
...
6         Это третье издание отменяет и заменяет второе издание, ISO/IEC 9899: 1999, as исправлено ISO/IEC 9899: 1999/Cor 1: 2001, ISO/IEC 9899: 1999/Cor 2: 2004 и ISO/IEC 9899: 1999/Cor 3: 2007. Основные изменения, произошедшие в предыдущем издании, включают:

    - условные (необязательные) функции (включая некоторые, которые ранее были обязательными)

    - поддержка нескольких потоков выполнения, включая улучшенное секвенирование памяти модель, атомные объекты и локальное хранилище потоков ( <stdatomic.h> и <threads.h>)
    - дополнительные макросы с плавающей запятой (<float.h>)
    - запрос и определение выравнивания объектов (<stdalign.h>, <stdlib.h>)
    - символы и строки Юникода (<uchar.h>) (изначально заданные в ISO/IEC TR 19769: 2004)
    - выражения типа-generic

    - статические утверждения

    - анонимные структуры и объединения

    - функции без возврата

    - макросы для создания сложных чисел (<complex.h>)

    - поддержка для открытия файлов для эксклюзивного доступа

    - удалил функцию gets (<stdio.h>)

    - добавлены aligned_alloc, at_quick_exit и quick_exitсильные > функции (<stdlib.h>)

    - (условная) поддержка интерфейсов проверки границ (изначально указана в ISO/IEC TR 24731-1: 2007)

    - (условная) поддержка для анализа