【问题标题】:The ISO C standard defines two classes of conforming implementationISO C 标准定义了两类符合要求的实现
【发布时间】:2012-11-22 12:05:23
【问题描述】:

我阅读了关于 GCC 的 this 官方手册。有时我在翻译文本时遇到问题。在第 6 页(第 2.1 章)我看不懂这样的文字片段:

ISO C 标准(在第 4 条中)定义了两类符合 执行。符合要求的托管实现支持整个 标准包括所有图书馆设施;符合的 独立实施只需要提供某些 图书馆设施:<float.h><limits.h><stdarg.h><stddef.h>;从 AMD1 开始,还有<iso646.h> 中的那些;从 C99 开始,也 <stdbool.h><stdint.h> 中的那些;从 C11 开始,还有那些在 <stdalign.h> 和 .此外,复杂类型,添加在 C99,独立实施不需要。标准 还为程序定义了两个环境,一个独立的 环境,所有实现都需要并且可能没有 超出独立的图书馆设施 实现,其中处理程序启动和终止 是实现定义的,并且是托管环境,这不是 必需,其中提供所有图书馆设施并启动 是通过函数int main (void)int main (int, char *[])。一个 操作系统内核将是一个独立的环境;一个程序使用 操作系统的设施通常会在托管 实施。

我不确定我是否理解正确......

我将改写我的理解方式:

  1. 存在两种 ISO C 标准实现:完整(称为符合托管的实现)和轻型(称为符合独立的实现)。
  2. 存在两种环境(针对每个标准的实施):托管环境(针对完整标准)和独立环境(针对轻型标准)。

轻量版用于操作系统开发。完整版适用于可在操作系统中运行的程序。

我不明白关于main 函数的短语。

我要求解释一下这段文字。

【问题讨论】:

    标签: c gcc


    【解决方案1】:

    这意味着在启动时执行 main() 函数不需要独立的环境。例如,它可能正在寻找 _main() 代替(确切的名称和签名由实现定义)。

    【讨论】:

    • 即如果我将使用独立环境,我可以为入口点设置任何其他名称吗?
    • 不一定可以设置,但是实现独立环境的人可以。
    • @Bush 您需要查阅有关如何提供入口点的文档。
    【解决方案2】:

    两者兼而有之。

    该标准定义了两个运行时环境。一个拥有所有的语言,加上标准运行时库的一小部分,加上额外的实现定义的东西。这是一个独立环境,并且(如您所料)用于在裸机上进行编程,例如一个操作系统内核。

    另一个更复杂的环境包括上述所有设施以及所有标准运行时库。这是一个托管环境,用于应用程序编程。

    现在,实现只需要包含独立环境的设施。如果仅此而已,则称为独立实现。用于深度嵌入式微控制器的交叉编译器通常是独立的实现,因为大部分标准 C 运行时没有意义或太大而无法容纳。

    实施托管环境是可选的;如果实现提供了托管环境,则称为托管实现。托管实现必须提供独立环境,即只有独立实现的设施可用的编译模式。 (这种模式通常用于编译诸如 C 运行时本身之类的东西,其中大部分只是更多的 C。)

    最后,mainint main(void)int main(int, char **))的标准签名是托管环境的一部分。独立环境也可以使用这些签名,但它也可以将main 的签名定义为它喜欢的任何名称(void main(void) 很常见)或为入口点使用不同的名称。

    【讨论】:

      【解决方案3】:

      C11 4/6:

      一致性实现的两种形式是托管的和独立的。符合要求的托管实现应接受任何严格符合要求的程序。符合标准的独立实现应接受任何严格符合标准的程序,其中库条款(第 7 条)中指定的功能的使用仅限于标准头文件 <float.h>, <iso646.h>, <limits.h>, <stdalign.h>, <stdarg.h>, <stdbool.h>, <stddef.h>, <stdint.h>, and <stdnoreturn.h> 的内容。

      首先请注意,在 C 标准的上下文中,“实现”是指“C 编译器的实现”,仅此而已。

      正如您在问题中正确陈述的那样,独立实现是系统的编译器,该系统不打算在其下具有操作系统。换句话说,独立的实现编译器生成的程序要么是在“裸机”CPU 上运行的嵌入式应用程序,要么是本身就是操作系统的程序。托管实现是一种编译器,适用于在操作系统之上运行的应用程序。

      独立应用程序的编译器只需要提供上述头文件。其余的标头(例如 stdio.h)在标准的“第 7 条”中定义,但对于独立实施而言,它们不是强制性的。

      但是请注意,有几个库对于托管或独立实现都不是强制性的,例如复数库: C11 7.3.1:

      “定义宏 _ _STDC_NO_COMPLEX_ _ 的实现不需要 提供此标头,也不支持它的任何设施。”

      此外,独立和托管两种不同的执行环境允许 main() 使用不同的语法,更多信息可以在 here 找到。程序员之间一个非常普遍的误解是,C 中唯一允许的形式是 int main(),这仅在托管环境中是正确的。

      例如,一个独立的程序可以从一个未复位的中断服务程序开始。从那里它可以调用void main() 函数,或者它可以完全调用其他函数:它是实现定义的。

      【讨论】:

      • 谢谢。这对我来说非常有用,也很有趣。
      猜你喜欢
      • 2010-10-13
      • 2023-03-31
      • 1970-01-01
      • 2015-10-31
      • 1970-01-01
      • 1970-01-01
      • 2011-11-03
      • 1970-01-01
      相关资源
      最近更新 更多