我看了这关于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 *[])提供和启动的。操作系统内核将是一个独立的环境;使用操作系统设施的程序通常处于托管实现中。
我不确定我是否理解得对。
我将重新表述我是如何理解它的:
轻型版本是为操作系统开发的。完整的版本是用于程序,这将在操作系统中工作。
我不明白关于main函数的短语。
我要求解释这段文字。
发布于 2012-12-04 19:22:47
两者兼而有之。
该标准定义了两个运行时环境。一个拥有所有的语言,加上标准运行时库的一个很小的子集,再加上其他实现定义的东西。这是一个独立的环境,并且(正如您所猜的)用于在裸金属上编程,例如操作系统内核。
另一个更复杂的环境包括上述所有工具以及所有标准运行时库。这是一个托管环境,用于应用程序编程。
现在,实施只需要包括独立环境的设施。如果只有这些,它就被称为独立实现。用于深度嵌入式微控制器的交叉编译器通常是独立的实现,因为许多标准C运行时没有意义,或者太大,无法适应。
实现宿主环境是可选的;如果实现提供托管环境,则称为托管实现。托管实现还必须提供独立的环境,即只有独立实现的设施可用的编译模式。(这种模式通常用于编译像C运行时本身这样的东西,其中大多数都是C。)
最后,main的标准签名(int main(void)和int main(int, char **))是宿主环境的一部分。独立的环境也可以使用这些签名,但也可以将main的签名定义为任何它喜欢的签名(void main(void)是常见的),也可以为入口点使用不同的名称。
发布于 2012-12-04 20:06:16
C11 4/6:
这两种形式的一致性实现是托管和独立的。合格的托管实现应接受任何严格符合的程序。符合规范的独立实现应接受任何严格符合的程序,其中库子句(第7条)中指定的特性的使用仅限于标准标头
<float.h>, <iso646.h>, <limits.h>, <stdalign.h>, <stdarg.h>, <stdbool.h>, <stddef.h>, <stdint.h>, and <stdnoreturn.h>的内容。
首先要注意的是,在C标准的上下文中," implementation“意味着”C编译器的实现“,而不是其他任何东西。
正如您在问题中正确声明的那样,独立实现是一个编译器,它的目的是在系统下面没有一个可操作的系统。换句话说,一个独立的实现编译器生成的程序要么是运行在“裸”CPU上的嵌入式应用程序,要么是作为操作系统本身的程序。宿主实现是用于运行在OS之上的应用程序的编译器。
独立应用程序的编译器只需要提供上面提到的头。其余的标头(如stdio.h)是在标准中提到的“第7条”中定义的,但对于独立实现来说,它们不是强制性的。
但是,请注意,对于既不托管也不独立的实现,几个库并不是强制性的,例如复数库: C11 7.3.1:
“定义宏_ _STDC_NO_COMPLEX_的实现不需要提供此标头,也不支持它的任何功能。”
此外,两种不同的执行环境--独立执行和托管--允许main()使用不同的语法,可以找到更多信息( 这里 )。程序员之间的一个非常常见的误解是,C中唯一允许的形式是int main(),这只在托管环境中是正确的。
例如,一个独立的程序可以从退出重置中断服务程序开始.在那里,它可以调用一个void main()函数,也可以完全调用其他函数:它是由实现定义的。
发布于 2012-12-04 19:11:10
这意味着在启动时执行main()函数不需要独立的环境。例如,它可能会寻找_main()而不是(确切的名称和签名是定义的实现)。
https://stackoverflow.com/questions/13710101
复制相似问题