独立实现和托管实现之间是否存在有意义的区别?

aut*_*tic 15 c c99 c11

我的问题主要涉及第四节第六段.

这两种符合实施形式是托管和独立的.符合要求的托管实现应接受任何严格符合的程序.

据我所知,这构成了典型的应用程序环境,包括文件系统,分配内存和线程......

一个符合独立实现应接受任何严格符合程序,其中使用的库条款(第7节)中指定的功能被限制在标准报头的内容<float.h>,<iso646.h>,<limits.h>,<stdalign.h>,<stdarg.h>,<stdbool.h>,<stddef.h>,<stdint.h>,和<stdnoreturn.h>.

......这构成了典型的内核和/或嵌入式最小环境,它没有标准文件系统,分配内存或线程(以及其他内容).

符合实现的实现可能具有扩展(包括附加库函数),前提是它们不会改变任何严格符合程序的行为.

似乎这给托管实现自由地称自己为托管或独立实现,当涉及到文件系统,分配内存或线程(以及其他内容)时,这些可以属于扩展类别,因此它只能实现每次都返回一个指示错误的值的接口.仅举几个:

  • fopen,fgets并且malloc可以返回NULL
  • fprintf,fscanf,fputc并且fgetc可以返回EOF
  • thrd_create可以返回thrd_error(表示"请求无法兑现")

这意味着区分第四节第六段给出的内容实际上毫无意义.是否有任何要求保证托管和独立实施中这些功能的某些实际功能级别?例如,是否要求上述函数实际上能够返回除相应故障值之外的其他函数?

too*_*ite 13

引用的段落已经很好地说明了这一点.

托管执行环境也是独立的,但反之亦然.编译器只需要提供独立的实现.例如,gcc严格来说是独立的,因为标准库不包括在内.但是,它假定在编译托管环境时可以使用它(默认值),假设lib在系统上可用(如glibc).看到这里

简而言之,独立式只是语言.它不需要支持任何库和几个标题(主要用于常见类型和实现特定的东西,如数字限制等).这意味着标准库不需要存在 - 相应的标题也不存在.原因是一个独立的环境,很可能不会有文件,显示等设施.它用于内核,裸机嵌入等.

请注意,例如gcc,如果编译托管环境(-fhosted),假设标准库中使用的函数具有相应的含义,并且可能应用非常积极的优化(它内置了许多这些函数).对于独立式,它实际上没有,所以你可以使用一个函数strcmp,例如完全不同的语义.但是,它假定mem ...-函数存在,因为它们用于普通代码,例如结构赋值.

所以,如果建造裸机,你应该总是通过-ffreestanding.

如果托管实现自称为独立式,那么它显然不再是托管实现.然而,一旦它自己托管,它必须提供标准所需的所有设施,不允许只实现虚拟,但必须提供标准中定义的语义.

只是说清楚:引用部分允许独立环境省略库的所有功能,除了少数列出的标题.因此,您可以自由地提供任何其他库并使用相同的名称,但您可以做任何您喜欢的事情.因为那不是标准库,所以不需要合规.

5.1.2.1进一步指出"除了第4条要求的最小集合之外,任何独立程序可用的库设施都是实现定义的.".这确实支持了我的发言.旁注:它也不需要main()作为程序入口点.

  • @Seb:也许同样禁止实现的部分就好像它需要50 PB的堆栈空间 - 输出"堆栈溢出"并退出(如果它不可用) - 除非给出一个非常特殊的源文件,它执行所有实现限制和然后输出消息"堆栈溢出".标准的作者认识到实现可以同时符合但无用,但是期望实现者使用判断并尝试使其实现有用. (2认同)