C1x已经成为ISO/IEC 9899:2011,也就是C11。
有没有人知道标准从2011年4月草案n1570到现在有哪些变化(如果有的话)?
预计:这里有来自伦敦(2011年3月)的委员会会议记录(应该包括在n1570中)此处, 和来自华盛顿特区的记录(2011年10月)此处; 我想列出DC会议中接受的更改清单应该可以涵盖所有内容。
sizeof
运算符、_Alignof
运算符或一元&
运算符的操作数,或者是用于初始化数组的字符串字面量,类型为“type数组”的表达式将被转换为类型为“指向数组对象的初始元素的type指针”的表达式,并且不是左值。_Alignof
是一个错误,因为unary-expression语法允许这种情况。_Alignof ( type-name )
但不是
_Alignof unary-expression
更多信息:在最近发布的ISO C委员会成员Larry Jones有关N1570和发布标准之间差异的帖子中,他写道:除了作为
sizeof
运算符或一元&
运算符的操作数,或用于初始化数组的字符串文字之外,具有“类型为数组类型”的表达式会转化为一个具有“指向数组对象的初始元素”的类型指针类型的表达式,并且不是lvalue。
消息ID:有很多这样的差异,但大多数只是一些次要的编辑调整、对样板文本的更改以及调整顺序以使高层人员满意。最大的变化是从许多它不应该添加的地方移除了_Alignof(基于错误的观念,即它像sizeof一样接受类型或表达式,而实际上它只接受类型):6.3.2.1p2、p3、p4、fn. 65;和6.7.1 fn. 121。
<rfg33a-u0q.ln1@jones.homeip.net>
在groups.google.com上看到的帖子。以下是来自 Jens Gustedt 在评论中的回答:
根据 Larry Jones 在 comp.std.c 上的评论,从 N1569 到 N1570 (没有变化标记的 N1570)之间没有重大变化。唯一未解决的问题是
__STDC_VERSION__
的值,但我猜最自然的值将是201112L
。
__STDC_VERSION__
和可选的__STDC_LIB_EXT1__
。第一个技术勘误将两者都定义为201112L
。请注意,本翻译不包含解释或额外内容。 - Keith Thompson_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>
)。char16_t
和 char32_t
类型用于存储 UTF-16/UTF-32 编码的数据,包括在 <uchar.h>
中的转换函数和相应的 u
和 U
字符串字面前缀,以及用于 UTF-8 编码字面量的 u8
前缀)。gets
函数,采用新的安全替代品 gets_s
。struct T { int tag; union { float x; int n; }; };
中。#if
和 #error
使用时更晚一些,当翻译器理解类型时。fopen
的独占创建和打开模式("…x"
后缀)。这类似于 POSIX 中的 O_CREAT|O_EXCL
,通常用于锁文件。quick_exit
函数,旨在在无法通过 exit
终止时进行至少最小化的去初始化。real + imaginary*I
如果 imaginary
是无穷大或 NaN 可能不会产生预期的值)。从ISO网站上,您可以购买完整的已发布标准。以下是从ISO网站上摘录的摘要:
ISO/IEC 9899:2011 规定了 C 语言程序的形式和解释。它规定了:
__STDC_VERSION__
的值,但我猜它最自然的值将是201112L
。 - Jens Gustedt201100L
进行测试应该是安全的。 - Jens Gustedt<201100L
或>= 201101L
。但我想这不被认为是一个缺陷。 - Johan Bezem