C编译器提供的标准C *.h
头文件之间是否有明确的区别,与标准C库提供的文件相反?是否有一些列表或一些标准位置?
动机:int this answer我前一段时间,关于最新TinyC compiler中遗失的unistd.h
,作者认为unistd.h
(与{{1}相反) })不应由编译器提供,而应由C库提供。
我无法理解这种反应(因为有一件事也不应该适用于sys/unistd.h
?),但我仍然对此感到疑惑。那是对的吗?哪个是权威参考?
在其他编译器中,我看到其他的"自包含" Windows中托管的POSIX C编译器(如MinGW附带的GCC工具链,有几个版本;或数字火星编译器),包括所有头文件。
在标准的Linux发行版(例如,Centos 5.10)中,我看到stdio.h
包在gcc
中提供了一些头文件(例如,stdbool.h
,syslimits.h
) } /usr/lib/gcc/i386-redhat-linux/4.1.1/include/
包提供glibc-headers
中的大多数标头(包括/usr/include/
,stdio.h
和 /usr/include/unistd.h
)。
因此,在任何情况下,我都看不到对上述声明的支持。
答案 0 :(得分:3)
不,没有明确的区别。
就C标准而言(here's a recent draft),编译器和库一起构成实现,主要通过标准的第6节和第7节中的描述来区分分别。
对于某些实现,编译器和运行时库由同一供应商/组织/个人提供,可以是单个可安装程序包,也可以是两个单独的程序包。对于其他实现(包括gcc),标准库的大部分由底层操作系统提供,但编译器的安装包包含一些自己的头文件。
另一个例子:当您在Solaris上从源安装gcc时,安装程序会运行一个脚本来抓取一些现有头文件的副本(由 Sun的 Oracle的运行时库提供)并编辑它们,安装修改后的副本在一个单独的目录中。
在GNU / Linux系统上,默认的C编译器通常是gcc,运行时库由glibc提供 - 两个GNU包,但是单独开发。 Windows下的MinGW实现将gcc编译器与Microsoft的运行时库一起使用(这导致了一些问题,因为他们对long double
的表示不同意。)
编译器的作者需要选择哪些标准头文件。其实现与特定编译器紧密相关的标头(例如<stdint.h>
,<limits.h>
和<float.h>
)通常由编译器提供;提供操作系统服务接口的标头(如<stdio.h>
和<stdlib.h>
)通常由运行时库或操作系统提供。
C标准没有就如何做出选择提供直接指导。
答案 1 :(得分:0)
除了嵌入式(独立式)C实现之外,将C分成编译器和库是没有意义的。没有库的编译器,没有没有编译器的C库都没有多大意义。只有编译器和库一起组成一个完整的实现。
自C89以来,标准库是C标准的一部分,标准中列出了所需的头文件列表。其他图书馆由Posix,X / Open标准化...... 请参阅此答案以获取列表:List of standard header files in C and C++
有一些标题本质上更靠近编译器本身,例如limits.h
,指定数据类型的大小。有些标题更接近操作系统,即unistd.h。然而,在这两种情况下,都有交叉点,如果OS&#39;例如,size_t
和编译器的实现不同意,没有任何方法可行。
有人也可能认为unistd.h
应该由操作系统而不是C库提供 - 毕竟,如何调用内核函数的知识属于操作系统。
总之,我认为这种区别于编译器,C库,操作系统没什么意义。