C1x已成为ISO / IEC 9899:2011又称C11。
是否有人知道April 2011 draft n1570中的标准中有哪些更改(如果有)?
ETA:伦敦的委员会会议记录(2011年3月)(应该包含在1570年)here,以及华盛顿特区(2011年10月)here;我想DC分钟中接受的变化列表应该涵盖的内容。
答案 0 :(得分:13)
我今天刚刚了解到,N1570与最终的C11标准(ISO / IEC 9899:2011(E))之间存在一个(有些)重大变化。
在N1570中,6.3.2p3说:
除非它是
sizeof
运算符的操作数,_Alignof
运算符,或一元&
运算符,或者是用于的字符串文字 初始化一个数组,一个类型为“ type ”的表达式 转换为指向类型为“指向类型”的指针的表达式 到数组对象的初始元素,而不是左值。
包含_Alignof
是一个错误,因为一元表达式的语法允许
_Alignof ( type-name )
但不是
_Alignof unary-expression
已发布的C11标准更正了此错误并恢复为C99措辞:
除非它是
sizeof
运算符的操作数,否则 一元&
运算符,或者是用于初始化数组的字符串文字,一个 类型为“ type ”的表达式转换为 带有“指向 type 的指针”的表达式,指向初始值 数组对象的元素,而不是左值。
更多信息:在最近向comp.std.c发布关于N1570与发布标准之间差异的帖子中,ISO C委员会成员Larry Jones写道:
其中有很多,但大多数只是轻微的编辑调整, 更改样板文本,并改变周围的东西以保持 快乐的力量。最大的变化是从a中删除_Alignof 一堆地方它不应该被添加(基于错误的 它需要一个类型或类似sizeof的表达式 当它真的只需要一种类型):6.3.2.1p2,p3,p4,fn。 65;和 6.7.1 fn。 121。
消息ID:<rfg33a-u0q.ln1@jones.homeip.net>
如在groups.google.com上看到的the thread。
答案 1 :(得分:5)
Jens Gustedt在评论中回答:
根据Larry Jones对comp.std.c的评论,N1569没有显着变化(N1570没有变化标记)。唯一尚未解决的问题是
__STDC_VERSION__
的值,但我想其中最自然的是201112L
。
答案 2 :(得分:2)
ISO已批准并发布了ISO / IEC 9899:2011 C语言编程新C11(C1x)标准。与C11 Wikipedia article中所述的先前标准(C99)的主要变化如下:
该标准包括对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>
用于不间断对象访问)。- 基于C Unicode技术报告ISO / IEC TR 19769:2004(
char16_t
和char32_t
类型改进了Unicode支持,用于存储UTF-16 / UTF-32编码数据,包括{中的转换函数{1}}以及相应的<uchar.h>
和u
字符串文字前缀,以及UTF-8编码文字的U
前缀。)- 删除
u8
函数,在以前的C语言标准修订版ISO / IEC 9899:1999 / Cor.3:2007(E)中弃用,支持新的安全替代方案{{1} }。- 界限检查界面(附件K)。
- 可分析性特征(附件L)。
- 用于查询浮点类型特征的更多宏,涉及次正规浮点数和类型能够存储的小数位数。
- 匿名结构和联盟,在联合和结构嵌套时非常有用,例如:在
gets
。- 静态断言,在译员理解类型时,在
gets_s
和struct T { int tag; union { float x; int n; }; };
之后的阶段进行翻译时进行评估。#if
的独占创建和打开模式(#error
后缀)。其行为类似于POSIX中的"…x"
,它通常用于锁定文件。fopen
函数作为终止程序的第三种方式,如果O_CREAT|O_EXCL
终止失败,则至少要进行最小的取消初始化。- 用于构造复杂值的宏(部分原因是
quick_exit
如果exit
为无限或NaN,real + imaginary*I
可能无法产生预期值。
从ISO网站,您可以购买full published standard。以下是摘自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程序的可移植性。它旨在供实施者和程序员使用。