C语言 C11的最新变化



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

有谁知道与2011年4月n1570草案相比,标准中有什么变化(如果有的话)吗?

ETA:这里是伦敦(2011年3月)的委员会会议记录(应该包含在n1570中),这里是华盛顿特区(2011年10月)的委员会会议记录;我想在DC会议纪要中列出一份可接受的变更清单应该涵盖所有事情。

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

在N1570中,6.3.2p3说:

除非是sizeof的操作数,否则_Alignof操作符,或一元&操作符,或用于初始化一个数组,一个类型为"类型为&quot的数组"的表达式;是转换为类型为"指针指向类型为"的表达式。指出指向数组对象的初始元素,且不能为左值。

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

_Alignof ( type-name )

但不

_Alignof unary-expression

发布的C11标准纠正了这个错误,并恢复到C99的措辞:

除非它是sizeof操作符的操作数,或一元&操作符,或用于初始化数组的字符串字面值类型为类型为&quot的数组的表达式;转换为类型为"指向类型为"的表达式指向起始点

为数组对象的元素,且不是左值。

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

有很多,但大多数只是轻微的编辑调整,对样板文本的更改,以及对周围的内容进行洗牌以保持快乐的力量。最大的变化是从a中删除了_Alignof一堆不应该添加的地方(基于错误)它要么接受类型,要么接受sizeof这样的表达式当它实际上只接受一个类型时):6.3.2.1p2, p3, p4, fn。65;和6.7.1 fn。121 .

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

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

Jens Gustedt在评论中回答:

根据Larry Jones在comp. stdc上的评论,N1569没有明显的变化(即没有变化标记的N1570)。唯一没有解决的是__STDC_VERSION__的值,但我想最自然的是201112L

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

该标准包括对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支持(用于存储UTF-16/UTF-32编码数据的char16_tchar32_t类型,包括<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网站上购买完整的已发布标准。以下是摘自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程序在各种数据处理系统之间的可移植性。它是为实现者和程序员使用的。

最新更新