4

实现以下每个不同标准的独立部分的编译器必须有何不同?支持所有模式所需的最少模式数(例如,由命令行标志指定)是多少?

  1. ISO/IEC 9899:1990
  2. ISO/IEC 9899:1990 + ISO/IEC 9899 TCOR1
  3. ISO/IEC 9899:1990 + ISO/IEC 9899 TCOR1 + ISO/IEC 9899 AM1
  4. ISO/IEC 9899:1990 + ISO/IEC 9899 TCOR1 + ISO/IEC 9899 AM1 + ISO/IEC 9899 TCOR2
  5. ISO/IEC 9899:1999
  6. ISO/IEC 9899:1999 + ISO/IEC 9899:1999 Cor。1:2001(E)
  7. ISO/IEC 9899:1999 + ISO/IEC 9899:1999 Cor。1:2001(E) + ISO/IEC 9899:1999 Cor。2:2004(E)
  8. ISO/IEC 9899:1999 + ISO/IEC 9899:1999 Cor。1:2001(E) + ISO/IEC 9899:1999 Cor。2:2004(E) + ISO/IEC 9899:1999 Cor。3:2007(E)
  9. ISO/IEC 9899:2011
4

1 回答 1

6

TC(技术勘误或技术修正)应被视为相应基础标准的一部分。因此,您确实有 4 个可能的标准需要处理:

  1. ISO/IEC 9899:1990 加上 TC。
  2. ISO/IEC 9899:1990 + AM1(实际上是 9899:1995)加上 TC。
  3. ISO/IEC 9899:1999 和 TC。
  4. ISO/IEC 9899:2011

C90 的修正案 1 为宽字符和多字节字符集添加了新的标题和功能,因此它包含了真正的新标准材料。技术勘误修正了标准措辞中的问题,阐明了需要澄清的内容,并更正了文档中的技术错误。

所以,我建议这四种模式就足够了:

  • -std=c90
  • -std=c95
  • -std=c99
  • -std=c11

或者,如果我们要注意导致千年虫问题的错误,那么:

  • -std=c1990
  • -std=c1995
  • -std=c1999
  • -std=c2011

(这样做的一个好处是最新的标准再次拥有最高的数字!)


对于独立实现,所需的四个标头几乎没有区别:

  • <stddef.h>
  • <limits.h>
  • <float.h>
  • <stdarg.h>

在 C99 中va_copy()添加了一个额外的宏/函数, 。<stdarg.h>

更正

我刚刚检查了 C99 的相关部分,C99 中的独立实现需要许多额外的头文件:

§4 一致性

¶6两种形式的一致性实现是托管的独立的。符合要求的托管实现应接受任何严格符合要求的程序。符合标准的独立实现应接受任何严格符合标准的程序,该程序不使用复杂类型,并且库条款(第 7 条)中指定的功能的使用仅限于标准头文件<float.h><iso646.h><limits.h><stdarg.h><stdbool.h><stddef.h><stdint.h>. 一个符合要求的实现可能有扩展(包括额外的库函数),只要它们不改变任何严格符合的程序的行为。3)

3) 这意味着一致的实现不保留除本国际标准中明确保留的标识符之外的标识符。

§5.1.2.1 独立环境

¶1在独立环境中(C 程序执行可能在没有任何操作系统优势的情况下发生),程序启动时调用的函数的名称和类型是实现定义的。除了第 4 节要求的最小集合之外,独立程序可用的任何库设施都是实现定义的。

¶2独立环境中程序终止的影响由实现定义。


否则,主要的变化发生在 C99 的核心语言中——比如新类型 ( long long)、新的初始化符号和 VLA 等等。从这个角度来看,AM1 (C95) 没有对独立实现进行任何更改(除非当时添加了有向图),因为主要更改是在独立实现中不需要的新标头中。

托管实现面临更多问题,因为库支持在 C90 和 C99 之间进行了相当广泛的修改。


独立实现的任何更改是否破坏了向后兼容性?换句话说,如果我有一个严格独立的符合 C{1990,1995,1999} 的程序,它是否必须在符合 C11 的实现上按预期编译和工作?

我不知道独立而不是托管实现的任何向后兼容性问题。在 C99 中,“隐式int”规则正式消失了——您应该在使用函数之前声明函数,并且返回类型应该是显式的int(因此,例如,简单main()的不再正式有效;您应该写int main()or,better,int main(void)或类似的) . 但这些是 C90 (C95) 和 C99 之间的一般变化——并非独立实现所特有的。(是的,我知道一个独立的实现不需要一个函数main()作为起点。)如果你的代码是“好的”并且在使用之前使用原型声明或定义了函数并且没有隐式int类型(强烈推荐使用原型符号定义的所有函数),那么对于 C90 独立程序好的东西将适用于 C99 或 C11。

于 2011-12-30T18:13:05.790 回答