Последние изменения в C11 - PullRequest
34 голосов
/ 25 декабря 2011

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

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

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

Ответы [ 3 ]

13 голосов
/ 01 апреля 2013

Я только сегодня узнал, что произошло одно (несколько) существенное изменение между 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 фн. 121.

Идентификатор сообщения: <rfg33a-u0q.ln1@jones.homeip.net>

Вот нить , как видно на groups.google.com.

5 голосов
/ 06 января 2012

Ответ Дженс Гастт в комментариях:

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

2 голосов
/ 07 января 2012

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

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

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

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

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

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

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