35

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

有谁知道2011 年 4 月草案 n1570标准中有哪些变化(如果有的话) ?

ETA:这里有来自伦敦(2011 年 3 月)的委员会会议记录(应该包含在 n1570 中) ,这里有来自华盛顿特区(2011 年 10 月)委员会会议记录;我想 DC 会议记录中接受的更改列表应该涵盖这些内容。

4

3 回答 3

15

我今天刚刚了解到,N1570 和最终的 C11 标准 (ISO/IEC 9899:2011 (E)) 之间有一个(有些)重大变化。

在 N1570 中,6.3.2p3 说:

除非它是运算sizeof符、运算符_Alignof 或一元&运算符的操作数,或者是用于初始化数组的字符串字面量,否则类型为“array of type ”的表达式将转换为类型为“pointer to type ”的表达式" 指向数组对象的初始元素,不是左值。

包含_Alignof是一个错误,因为一元表达式的语法允许

_Alignof ( type-name )

但不是

_Alignof unary-expression

已发布的 C11 标准更正了此错误并恢复为 C99 措辞:

除非它是运算符的操作数sizeof,或一元运算&符,或者是用于初始化数组的字符串字面量,否则类型为“类型数组的表达式将转换为类型为“指向类型的指针”的表达式到数组对象的初始元素并且不是左值。

更多信息:在最近发布到 comp.std.c 关于 N1570 和已发布标准之间差异的帖子中,ISO C 委员会成员拉里·琼斯写道:

其中有很多,但大多数只是轻微的编辑调整、对样板文本的更改,以及对事物进行洗牌以保持权力的快乐。最大的变化是从一堆不应该添加的地方删除 _Alignof(基于错误的概念,即它需要一个类型或像 sizeof 这样的表达式,而实际上它只需要一个类型):6.3.2.1p2, p3,p4,fn。65; 和 6.7.1 英尺。121.

消息 ID:<rfg33a-u0q.ln1@jones.homeip.net>

这是在 groups.google.com 上看到的线程。

于 2013-04-01T04:04:56.833 回答
5

Jens Gustedt在评论中回答:

根据 Larry Jones 在 comp.std.c 上的评论,与 N1569(即没有变化标记的 N1570)相比没有显着变化。唯一未解决的是 的值__STDC_VERSION__,但我想很自然地会是201112L

于 2012-01-06T17:16:43.317 回答
1

ISO 已批准并作为 ISO/IEC 9899:2011 发布了 C 编程语言的新 C11 (C1x) 标准。正如C11 维基百科文章中所写,与以前的标准 (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 Technical Report ISO/IEC TR 19769:2004 改进的 Unicode 支持(char16_t以及char32_t用于存储 UTF-16/UTF-32 编码数据的类型,包括转换函数<uchar.h>和相应的u字符串字面前缀U,以及u8UTF-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。这与 POSIX 中的行为类似O_CREAT|O_EXCL,通常用于锁定文件。
  • quick_exit函数作为终止程序的第三种方式,旨在在终止exit失败时至少进行最小的反初始化。
  • 用于构造复杂值的宏(部分原因是如果为无限或 NaN ,real + imaginary*I可能不会产生预期值)。imaginary

您可以从 ISO 站点购买完整的已发布标准。这是从 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 程序在各种数据处理系统之间的可移植性。它旨在供实施者和程序员使用。
于 2012-01-07T00:20:04.653 回答