Последние изменения в C11

C1x стал ISO/IEC 9899: 2011 aka C11.

Кто-нибудь знает, какие изменения (если есть) есть в стандарте из апрель 2011 г. проект n1570?

ETA: Есть протоколы Комитета от Лондона (март 2011 года) (который должен быть включен в n1570) здесь, и из Вашингтона, округ Колумбия (Октябрь 2011 г.) здесь; Я полагаю, что список принятых изменений в протоколах DC должен охватывать все.

Ответ 1

Недавно я узнал, что произошло одно (несколько) существенное изменение между N1570 и окончательным стандартом C11 (ISO/IEC 9899: 2011 (E)).

В N1570, 6.3.2p3 говорится:

За исключением случаев, когда это операнд оператора sizeof, _Alignofоператора или унарного оператора & или является строковым литералом, используемым для инициализировать массив, выражение, которое имеет тип "массив типа", является преобразуется в выражение с типом "указатель на тип", который указывает к исходному элементу объекта массива и не является lvalue.

Включение _Alignof было ошибкой, так как синтаксис унарного выражения позволяет

_Alignof ( type-name )

но не

_Alignof unary-expression

Выпущенный стандарт C11 исправляет эту ошибку и возвращается к формулировке C99:

За исключением случаев, когда это операнд оператора sizeof или унарный оператор & или строковый литерал, используемый для инициализации массива, выражение, которое имеет тип "массив типа", преобразуется в выражение с типом "указатель на тип", указывающий на начальный элемент объекта массива и не является lvalue.

Дополнительная информация: в недавнем сообщении на comp.std.c о различиях между N1570 и выпущенным стандартом Ларри Джонс, член комитета ISO C, написал:

Есть несколько из них, но большинство из них - лишь незначительные редакционные твики, изменения текста шаблона и перетасовки вокруг, чтобы сохранить которые будут счастливы. Самым большим изменением было удаление _Alignof из куча мест, которые он не должен был добавлять (на основе ошибочного что он принимает либо тип, либо выражение типа sizeof когда он действительно принимает только тип): 6.3.2.1p2, p3, p4, fn. 65; а также 6.7.1 fn. 121.

Message-ID: <[email protected]>

Здесь поток, как показано на groups.google.com.

Ответ 2

Отвечал Jens Gustedt в комментариях:

Согласно комментарию Ларри Джонса на comp.std.c не произошло существенных изменений от N1569 (это N1570 без маркеров изменений). Единственное, что остается нерешенным, это значение для __STDC_VERSION__, но, я думаю, наиболее естественно это будет 201112L.

Ответ 3

ISO ратифицировала и опубликовала в качестве стандарта ISO/IEC 9899: 2011 новый стандарт C11 (C1x) для языка программирования C. Основные изменения от предыдущего стандарта (C99), описанные в C11 Wikipedia article, следующие:

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

  • Спецификация выравнивания (_Alignas спецификатор, оператор _Alignof, aligned_alloc, заголовочный файл <stdalign.h>)
  • Спецификатор функции _Noreturn
  • Типовые выражения с использованием ключевого слова _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 на основе технического отчета C Unicode 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" суффикс) для fopen. Это ведет себя как O_CREAT|O_EXCL в POSIX, который обычно используется для файлов блокировки.
  • Функция quick_exit как третий способ завершить программу, предназначенную для выполнения минимального деинициализации, если завершение с помощью exit завершается с ошибкой.
  • Макросы для построения сложных значений (отчасти потому, что real + imaginary*I может не дать ожидаемого значения, если imaginary бесконечно или NaN).

На сайте ISO вы можете купить полный опубликованный стандарт. Вот аннотация, взятая с сайта ИСО:

ISO/IEC 9899: 2011 определяет форму и устанавливает интерпретацию программ, написанных на языке программирования C. Он указывает

  • представление программ на C;
  • синтаксис и ограничения языка C;
  • семантические правила для интерпретации программ на C;
  • представление входных данных, обрабатываемых программами C;
  • представление выходных данных, созданных программами C;
  • ограничения и ограничения, налагаемые соответствующей реализацией C.

ISO/IEC 9899: 2011 не указывается

  • механизм, с помощью которого программы C преобразуются для использования системой обработки данных;
  • механизм, с помощью которого программ C вызывается для использования системой обработки данных;
  • механизм, с помощью которого входные данные преобразуются для использования программой C;
  • механизм, с помощью которого выходные данные преобразуются после создания программой C;
  • размер или сложность программы и ее данных, которые превысят пропускную способность любой конкретной системы обработки данных или емкости конкретного процессора;
  • все минимальные требования системы обработки данных, способные поддерживать соответствующую реализацию. ISO/IEC 9899: 2011 предназначен для обеспечения мобильности программ C среди различных систем обработки данных. Он предназначен для использования разработчиками и программистами.