7

我阅读有关 GCC 的官方手册。有时我在翻译文本时遇到问题。在第六页(第 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功能的短语。

我要求向我解释这段文字。

4

3 回答 3

12

两者兼而有之。

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

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

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

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

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

于 2012-12-04T19:22:47.940 回答
5

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() 使用不同的语法,更多信息可以在这里找到。程序员之间一个非常普遍的误解是 C 中唯一允许的形式是int main(),这仅在托管环境中是正确的。

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

于 2012-12-04T20:06:16.373 回答
1

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

于 2012-12-04T19:11:10.350 回答