首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ISO C标准定义了两类一致性实现。

ISO C标准定义了两类一致性实现。
EN

Stack Overflow用户
提问于 2012-12-04 19:05:36
回答 3查看 1.2K关注 0票数 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函数的短语。

我要求解释这段文字。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-12-04 19:22:47

两者兼而有之。

该标准定义了两个运行时环境。一个拥有所有的语言,加上标准运行时库的一个很小的子集,再加上其他实现定义的东西。这是一个独立的环境,并且(正如您所猜的)用于在裸金属上编程,例如操作系统内核。

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

现在,实施只需要包括独立环境的设施。如果只有这些,它就被称为独立实现。用于深度嵌入式微控制器的交叉编译器通常是独立的实现,因为许多标准C运行时没有意义,或者太大,无法适应。

实现宿主环境是可选的;如果实现提供托管环境,则称为托管实现。托管实现还必须提供独立的环境,即只有独立实现的设施可用的编译模式。(这种模式通常用于编译像C运行时本身这样的东西,其中大多数都是C。)

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

票数 12
EN

Stack Overflow用户

发布于 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()函数,也可以完全调用其他函数:它是由实现定义的。

票数 5
EN

Stack Overflow用户

发布于 2012-12-04 19:11:10

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13710101

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档