ISO C标准定义了两类符合实现

And*_*man 5 c gcc

我读了本关于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. 存在两个环境(对于每个标准的实现):托管环境(用于完整标准)和独立环境(用于光标准).

轻型版本用于OS开发.完整版本适用于可在OS中运行的程序.

我不理解关于main功能的短语.

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

zwo*_*wol 8

这两者都有.

该标准定义了两个运行时环境.一个人拥有所有语言,加上标准运行时库的一小部分,以及其他实现定义的东西.这是一个独立的环境,并且(正如您猜测的那样)用于裸机编程,例如OS内核.

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

现在,实施需要包括独立环境的设施.如果就是这样,它就被称为独立实施.用于深度嵌入式微控制器的交叉编译器通常是独立的实现,因为大部分标准C运行时没有意义或者太大而不适合.

实现托管环境是可选的; 如果实现提供托管环境,则称为托管实现.托管实现必须提供独立环境,即只有独立实现的设施可用的编译模式.(此模式通常用于编译C运行时本身,其中大多数只是C.)

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


Lun*_*din 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()函数,或者它可以完全调用其他一些函数:它是实现定义的。