【问题标题】:What are the differences between the various WG14 C standards for freestanding implementations?独立实施的各种 WG14 C 标准之间有什么区别?
【发布时间】:2011-12-30 18:04:21
【问题描述】:

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

  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

【问题讨论】:

    标签: c compiler-construction standards freestanding


    【解决方案1】:

    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 中,<stdarg.h> 添加了一个额外的宏/函数va_copy()

    修正

    我刚刚检查了 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() 或者,更好的是int main(void) 或类似的)。但这些是 C90 (C95) 和 C99 之间的一般变化——并非独立实现所特有的。 (是的,我知道独立实现不需要以函数 main() 作为起点。)如果您的代码是“好”并且在使用前使用原型声明或定义了函数并且没有隐式 int 类型(并且强烈推荐使用原型符号定义的所有函数),那么对于 C90 独立程序好的东西将适用于 C99 或 C11。

    【讨论】:

    • 独立实现的任何更改是否破坏了向后兼容性?换句话说,如果我有一个严格独立的符合 C{1990,1995,1999} 的程序,它是否必须在符合 C11 的实现上按预期编译和工作?
    • 请根据 GCC 文档更新此答案“c95”不是问题:gcc.gnu.org/onlinedocs/gcc/C-Dialect-Options.html
    • @user894319twitter — 我引用了哪个文档被认为是 C95;这是 AM1 文件。早在 2011 年左右,GNU C 编译器就认可了 C95。他们现在可能不会这样做,但这不是编辑此答案的好理由。您的评论作为脚注,8 年后,情况发生了变化。这个回应也是如此。如果我确实编辑了答案,我会简单地注意到,在 2011 年,GCC 识别了 C95,但在 2019 年,它没有,可能是因为当时没有人使用它。 C99 已经有十多年的历史了,C11 也差不多准备好了。
    • @JonathanLeffler 您必须阅读实际的 GCC 文档才能了解修正 1 中修改的 ISO C90 的“iso9899:199409”值。很难跟上这些活跃的项目。只需留下指向文档的指针
    猜你喜欢
    • 2015-03-25
    • 2012-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-19
    • 2021-07-24
    • 2011-05-24
    相关资源
    最近更新 更多