C11的最新变化

时间:2011-12-25 19:44:34

标签: c standards c11

C1x已成为ISO / IEC 9899:2011又称C11。

是否有人知道April 2011 draft n1570中的标准中有哪些更改(如果有)?

ETA:伦敦的委员会会议记录(2011年3月)(应该包含在1570年)here,以及华盛顿特区(2011年10月)here;我想DC分钟中接受的变化列表应该涵盖的内容。

3 个答案:

答案 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_tchar32_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_sstruct 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程序的可移植性。它旨在供实施者和程序员使用。
  •