什么是 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_GNUC17CLK_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准备了非常有用的资料。


他确定了C17C11 相比的以下更改列表:

原子: 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)、ilogberfclgamma

clock 规格不足 (7.27.2.1)

尺寸 0 (7.22.3.5) 的 realloc 规格不足

附件 F: FLT_ROUNDS (F.2 p1)

附件 K: tmpnam_ssnprintf_ssprintf_svsprintf_sget_smbstowcs_swcstombs_ssnwprintf_s、@987654532 @、vsnwprintf_svswprint_smbsrtowcs_swcsrtombs_s

链接到主页C17。


另外,此内容将由Jens更新,您可以关注更新 这里Jeans Gustedt Blog。

P.S: before posting all this stuff I received approval from the author.

【讨论】:

非常整洁的书;谢谢。这就像 Klemens 的 21 世纪 C 的开放获取、更系统、更深入的版本。

以上是关于什么是 C17,语言做了哪些改变?的主要内容,如果未能解决你的问题,请参考以下文章

ChatGPT可以改变哪些行业?

微服务给传统架构带来哪些改变

Element-ui 2.8.0版本中提升表格性能,做了哪些事情,原理是什么

2023年的 Rust 将会有哪些新改变?

Ubuntu 16.04都有哪些改变

使用 GetX 改变主题?