什么是 C17,语言做了哪些改变?
Posted
技术标签:
【中文标题】什么是 C17,语言做了哪些改变?【英文标题】:What is C17 and what changes have been made to the language? 【发布时间】:2018-05-11 19:24:23 【问题描述】:当我查看有关 GCC 8 的新闻时,我 saw 说他们增加了对 2017 版 C 语言(不是 C++17,实际上是 C17)的支持。但是我在网上找不到任何关于它的信息。
它是像 C11 这样的新 ISO 版本,还是只是 GCC 团队用于在其编译器中进行一些更正的代号?
【问题讨论】:
您最多只能针对 ISO 标准发布一定数量(两个?)的技术勘误 (TC)。如果您在已经发布了 x 个 TC 后需要进一步修正,则必须发布新版本的标准。我怀疑这里就是这种情况。 @Lundin:C99 有三个 TC(合并到 N1256)。从那时起,规则可能已经改变。 【参考方案1】:根据GCC 参考,C17
实际上是C11
标准的错误修复版本,集成了DR 分辨率。
C17,具有 DR [缺陷报告] 分辨率的 C11 标准的错误修复版本 综合,很快就会去投票。这个补丁增加了相应的 选项
-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__
值而不是发布日期。)(有几个 DR 解决方案需要在 GCC 中实施,但是 这与新选项无关。)
因此,C17 中没有包含新功能。
Cppreference (History of C) 说:
未来发展
C17 下一个次要 C 语言标准修订版,将包括所有接受的 C11 缺陷报告,但没有新功能。
更新:
2018: C17 (ISO/IEC 9899:2018) (ISO Store) (Final draft) 包括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]
【讨论】:
那么它是由ISO发布的,但它只是一个错误修复版本。谢谢! 为了补充这一点,实际上提出了一项有效的更改:对于原子变量的初始化,不再强制使用ATOMIC_VAR_INIT
。简单的正常初始化就足够了。
对于那些不习惯阅读标准胡言乱语的人:DR 代表缺陷报告。
C17 是否明确定义了使用聚合成员左值访问聚合存储的代码的行为?在迄今为止的每个版本中,像struct foo int x; s = 0; s.x = 3;
这样的东西会使用int
类型的左值写入与struct foo
关联的存储,但int
不是可用于访问@987654399 的左值类型之一@.
C17 标准现在可以购买,尽管我不确定 ANSI 为何将价格从 60 美元提高到 116 美元大约 93%。 webstore.ansi.org/…【参考方案2】:
C17
是“M.S Chaudhari
”注意到的 C 标准的“错误修复版本”。不过Jens Gustedt
"Modern C"
书的作者Jens Gustedt
准备了非常有用的资料。
他确定了C17
与C11
相比的以下更改列表:
原子: initialization (7.17.2, 7.31.8),一致性要求 (5.1.2.4),栅栏 (7.17.3 p11),函数或宏 (7.17.1 p6),无锁取决于类型 ( 7.17.5 p3),compare exchange compares memory and not value (7.17.7.3),atomic_flag (7.17.18)。
线程: spurious failures (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)
_Generic
(6.5.1.1), rvalues and qualification, cast (6.5.4)对齐:基本对齐 (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
。
clock
规格不足 (7.27.2.1)尺寸 0 (7.22.3.5) 的
realloc
规格不足附件 F:
FLT_ROUNDS
(F.2 p1)附件 K:
tmpnam_s
、snprintf_s
、sprintf_s
、vsprintf_s
、get_s
、mbstowcs_s
、wcstombs_s
、snwprintf_s
、@987654532 @、vsnwprintf_s
、vswprint_s
、mbsrtowcs_s
、wcsrtombs_s
。
链接到主页C17。
另外,此内容将由Jens
更新,您可以关注更新
这里Jeans Gustedt Blog。
P.S: before posting all this stuff I received approval from the author.
【讨论】:
非常整洁的书;谢谢。这就像 Klemens 的 21 世纪 C 的开放获取、更系统、更深入的版本。以上是关于什么是 C17,语言做了哪些改变?的主要内容,如果未能解决你的问题,请参考以下文章