【问题标题】:Latest changes in C11C11 的最新变化
【发布时间】:2012-01-27 17:01:11
【问题描述】:

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

有谁知道标准与April 2011 draft n1570相比有哪些变化(如果有的话)?

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

【问题讨论】:

  • 根据 Larry Jones 在 comp.std.c 上的评论,与 N1569(即没有更改标记的 N1570)相比,没有显着变化。唯一未解决的是__STDC_VERSION__ 的值,但我想最自然的是201112L
  • 感谢您提供的信息,@JensGustedt。顺便说一句,我链接到 n1570 是因为该链接是公开的; n1569 也可以下载,但不能直接下载。
  • @JohanBezem,他们甚至忘记了这一点?所以我们可以发布第一个缺陷报告 :) 幸运的是,它只使用整数,所以任何通过对 201100L 进行测试的东西都应该是安全的。
  • @JensGustedt 我刚刚删除了我自己的评论,因为你已经描述了情况,没有什么可补充的。我认为这对于“首次发布”来说是正常的,因为 ISO 过程非常复杂,而且你永远不知道它是否会在圣诞节前完成,但你必须提供最终的校对文件。我想我们最好按照您的建议使用它,例如 < 201100L>= 201101L。但我想这不被认为是缺陷。
  • 我也在详细阅读 n1570 并调查它与最终标准之间的差异。我主要关注语言的最终type hierarchy

标签: c standards c11


【解决方案1】:

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

在 N1570 中,6.3.2p3 说:

除非它是sizeof 运算符的操作数,否则_Alignof 运算符,或一元 & 运算符,或者是用于 初始化一个数组,一个类型为“type”的表达式是 转换为类型为“pointer to type”的表达式 到数组对象的初始元素并且不是左值。

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

_Alignof ( type-name )

但不是

_Alignof unary-expression

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

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

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

其中有很多,但大多数只是轻微的编辑调整, 更改样板文本,并随机播放内容以保持 快乐的力量。最大的变化是从 一堆不应该添加的地方(基于错误的 认为它需要一个类型或像 sizeof 这样的表达式 当它真的只需要一个类型时):6.3.2.1p2,p3,p4,fn。 65;和 6.7.1 英尺。 121.

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

这里是 groups.google.com 上的 the thread

【讨论】:

    【解决方案2】:

    由 cmets 中的Jens Gustedt 回答:

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

    【讨论】:

    • 2011 年官方标准留下了__STDC_VERSION__ 和可选的__STDC_LIB_EXT1__ 定义不正确。第一个技术勘误定义为201112L
    【解决方案3】:

    ISO 已批准并作为 ISO/IEC 9899:2011 发布了 C 编程语言的新 C11 (C1x) 标准。与 C11 Wikipedia article 中所写的先前标准 (C99) 相比的主要变化如下:

    该标准包括对 C99 语言和库规范的多项更改,例如:

    • 对齐规范(_Alignas 说明符、_Alignof 运算符、aligned_alloc 函数、<stdalign.h> 头文件)
    • _Noreturn 函数说明符
    • 使用_Generic 关键字的类型通用表达式。例如,下面的宏cbrt(x) 会根据x 的类型转换为cbrtl(x)cbrt(x)cbrtf(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 的 Unicode 支持(char16_tchar32_t 类型,用于存储 UTF-16/UTF-32 编码数据,包括 <uchar.h> 和对应的 uU 字符串文字前缀,以及 UTF-8 编码文字的 u8 前缀)。
    • 删除 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 更晚的阶段进行评估,此时翻译器可以理解类型。
    • fopen 的专有创建和打开模式("…x" 后缀)。这类似于 POSIX 中的 O_CREAT|O_EXCL,通常用于锁定文件。
    • quick_exit 函数作为终止程序的第三种方式,旨在在使用 exit 终止失败时至少执行最小限度的取消初始化。
    • 用于构造复杂值的宏(部分原因是如果imaginary 为无限或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 程序在各种数据处理系统之间的可移植性。它旨在供实施者和程序员使用。

    【讨论】:

    • 这甚至没有尝试回答所提出的问题,这与 C11 和 C99 之间的差异无关。
    • 我同意@MarkAmery。问题是关于 N1570 和最终发布的 C11 之间的差异。
    猜你喜欢
    • 2014-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 2012-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多