我在查阅GCC 8的新闻时看到,他们为C语言的2017版本添加了支持(不是C++17,确实是C17),但我在互联网上找不到任何相关信息。
它是像C11一样的新ISO版本,还是GCC团队用于修复编译器中某些问题的代号?
我在查阅GCC 8的新闻时看到,他们为C语言的2017版本添加了支持(不是C++17,确实是C17),但我在互联网上找不到任何相关信息。
它是像C11一样的新ISO版本,还是GCC团队用于修复编译器中某些问题的代号?
C17
实际上是C11
标准的修复版本,集成了DR解决方案。
C17是
C11
标准的修复版本,集成了DR [缺陷报告]解决方案,并将很快进入表决阶段。此补丁添加了相应选项-std=c17
,-std=gnu17
(新默认版本,替换-std=gnu11
作为默认版本),-std=iso9899:2017
。作为标准的修复版本,不需要flag_isoc17
或任何兼容性警告选项;但是,有一个新的__STDC_VERSION__
值,因此添加了新的cpplib语言CLK_GNUC17
和CLK_STDC17
以支持使用该新值和新选项。(如果该标准最终在2018年发布并被称为C18
,则可以添加选项别名。但是请注意,-std=iso9899:199409
对应于__STDC_VERSION__
值而不是出版日期。)(还有一些需要在GCC中实现的DR解决方案,但这与新选项无关。)
所以,C17标准中没有新增的功能。
未来的发展
C17是下一个较小的C语言标准修订版,将包括所有已被接受的C11缺陷报告,但没有新功能。
更新:
2018年:C17(ISO/IEC 9899:2018)(ISO存储) (最终草案) 包括废弃ATOMIC_VAR_INIT
和修复以下缺陷报告:[DR 400], [DR 401], [DR 402], [DR 403], [DR 404], [DR 405], [DR 406], [DR 407], [DR 410], [DR 412], [DR 414], [DR 415], [DR 416], [DR 417], [DR 419], [DR 423], [DR 426], [DR 428], [DR 429], [DR 430], [DR 431], [DR 433], [DR 434], [DR 436], [DR 437], [DR 438], [DR 439], [DR 441], [DR 444], [DR 445], [DR 447], [DR 448], [DR 450], [DR 452], [DR 453], [DR 457], [DR 458], [DR 459], [DR 460], [DR 462], [DR 464], [DR 465], [DR 468], [DR 470], [DR 471], [DR 472], [DR 473], [DR 475], [DR 477], [DR 480], [DR 481], [DR 485], [DR 487], [DR 491]。ATOMIC_VAR_INIT
来初始化原子变量。普通的初始化就足够了。 - Jens Gustedtstruct foo {int x;} s = {0}; s.x = 3;
这样的代码将使用类型为int
的lvalue写入与struct foo
相关联的存储,但是int
不是可以用于访问struct foo
的lvalue类型之一。 - supercatC17
是C语言标准的“bugfix版本”,正如"M.S Chaudhari
"所指出的。不过,"Modern C"
一书作者Jens Gustedt
提供了非常有用的信息。
他列出了以下关于C17
相比于C11
的变化:
原子操作: 初始化 (7.17.2, 7.31.8), 一致性要求 (5.1.2.4), 栅栏 (7.17.3 p11), 函数或宏 (7.17.1 p6), 无锁取决于类型 (7.17.5 p3), 比较交换比较内存而不是值 (7.17.7.3), 原子标志 (7.17.18).
线程: 虚假故障 (7.26.3.5 p2, 7.26.3.6 p2, 7.26.4.5 p3), 同步 (7.26.4 p1), 线程特定存储 (
tss_t
) 和线程退出 (7.26.5 p3, 7.26.5.5, 7.26.6)对齐: 基本对齐 (6.2.8),
_Alignas
(6.7.5),aligned_alloc
(7.22.3.1)序列点: 完整表达式 (6.8 p4), 完整声明符 (6.7..6 p3)
无限循环 (6.8.5 p6)
保留标识符 (7.1.3)
域或范围错误 (7.12.1),
ilogb
,erfc
,lgamma
.Annex F:
FLT_ROUNDS
(F.2 p1)Annex K:
tmpnam_s
,snprintf_s
,sprintf_s
,vsprintf_s
,get_s
,mbstowcs_s
,wcstombs_s
,snwprintf_s
,swprintf_s
,vsnwprintf_s
,vswprint_s
,mbsrtowcs_s
,wcsrtombs_s
.
clock
规范不明确 (7.27.2.1)
realloc
对于大小为0规范不明确 (7.22.3.5)链接到主页 C17。
此外,这篇内容将由
Jens
更新,您可以在这里关注更新:Jeans Gustedt 博客。
P.S:发布所有这些内容之前,我已经得到了作者的批准。