各种WG14 C标准在独立实施方面有何不同?

时间:2011-12-30 18:04:21

标签: c compiler-construction standards

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

  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

1 个答案:

答案 0 :(得分:5)

TC(技术更正或技术更正)应视为相应基准标准的一部分。所以,你真的有4种可能的标准来处理:

  1. ISO / IEC 9899:1990 plus TCs。
  2. ISO / IEC 9899:1990 + AM1(实际上是9899:1995)加上TC。
  3. ISO / IEC 9899:1999 plus TCs。
  4. ISO / IEC 9899:2011
  5. C90的修正案1为宽字符和多字节字符集添加了新的标题和函数,因此它包含了真正的新标准材料。技术更正修复了标准措辞中的问题,澄清了需要澄清的内容,并纠正了文档中的技术错误。

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

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

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

    • -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程序执行可能在没有任何情况下执行)   操作系统的好处),程序调用的函数的名称和类型   startup是实现定义的。任何独立的图书馆设施   程序,除了第4条要求的最小集合外,都是实现定义的。

         

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


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

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


      

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

    我不知道独立而不是托管实现的任何向后兼容性问题。使用C99,“隐式int”规则正式消失 - 您应该在使用它们之前声明函数,并且返回类型应该是显式的int(例如,简单的main()是不再正式有效;您应该写int main()或更好,int main(void)或类似内容。但这些是C90(C95)和C99之间的一般变化 - 不是独立实施所特有的。 (是的,我知道独立实现不需要函数main()作为起点。)如果你的代码是'好'并且在使用之前使用原型声明或定义了函数,并且没有隐式{{1我们强烈建议使用类型(以及使用原型表示法定义的所有函数),那么对C90独立程序有用的东西适用于C99或C11。

相关问题