【发布时间】:2016-08-10 17:24:36
【问题描述】:
在 C99 中是否有引入或删除的特性/语义可以使 C89 编写的程序定义明确
- 无效(即不再编译,根据 C99 标准)
- 正在编译,但语义不同。
到目前为止,我的发现是关于明显无效的程序:
- 隐式 int (C89 §3.5.2)
- 隐式函数声明(C89 §3.3.2.2)
- 不从期望返回值的函数返回 (C89 §3.6.6.4)
- 使用新关键字作为标识符(例如
restrict、inline等) - 涉及
//的黑客攻击,现在被视为 cmets。但是,在生产代码中几乎从未遇到过。
细微的变化,使相同的代码具有不同的语义:
- 已经很好地定义了整数除法,例如 -3 / 2 现在必须向零截断(C99 §6.5.5/6),而不是实现定义(C89 §3.3.5/6)
-
strtod通过解析0x或0X获得了在 C99 中解析十六进制数字的能力
我错过了什么?
【问题讨论】:
-
根据标题,问题实际上是关于 C99 中的重大更改。绝对不会太宽泛。
-
@Olaf:关于语言历史的问题在这里并不是题外话,也不以任何方式暗示问他们的人“错过了过去 17 年的 C 开发”。
-
@Olaf 听说过这个所谓的“Linux”吗?如果您在内核上进行开发,则必须坚持使用 C89(或带有 GNU 扩展的 C89)。
-
@Olaf:1990 年的 ISO C 标准描述的语言与 1989 年的 ANSI C 标准描述的语言完全相同,ANSI 在发布后正式采用了 ISO C90。 ANSI 在 1999 年和 2011 年 ISO C 标准发布后不久也正式采用了这些标准。至于 C89/C90 和 C99 已经过时,就 ISO 而言这是完全正确的,但它们仍然相关,讨论它们是完全合适的。您可以随意忽略该标准的旧版本,但无需告诉我们其他人我们不应该提及它们。
标签: c language-lawyer c99 c89