Последние изменения в 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 среди различных систем обработки данных. Он предназначен для использования разработчиками и программистами.