C 编译器提供的标准 C *.h
头文件与标准 C 库提供的头文件之间是否有明确的区别?有一些列表或一些标准位置吗?
动机:int this answer我不久前收到关于最新 TinyC compiler 中缺少 unistd.h
的信息,作者认为 unistd.h
(与 sys/unistd.h
相反)不应由编译器提供,而应由 C 库提供。
我无法理解这个回应(一方面,这不应该也适用于,比如说,stdio.h?),但我仍然想知道它。那是对的吗?哪里有这方面的权威引用?
查看其他编译器,我发现 Windows 中托管的其他“自包含”POSIX C 编译器(例如 MinGW 附带的 GCC 工具链,有多种版本;或 Digital Mars 编译器)包含所有头文件。
在标准 Linux 发行版(例如 Centos 5.10)中,我看到 gcc 包提供了一些头文件(例如,stdbool.h、 syslimits.h
)位于 /usr/lib/gcc/i386-redhat-linux/4.1.1/include/
中,并且 glibc-headers
软件包提供了/usr/include/
中的大部分 header (包括 stdio.h
、/usr/include/unistd.h
和 /usr/include/sys/unistd.h
)。
因此,在这两种情况下,我都认为上述主张得到了支持。
最佳答案
不,没有明确的区别。
就 C 标准而言 ( here's a recent draft ),编译器和库共同构成了实现,其主要区别在于分别在标准的第 6 节和第 7 节中进行了描述.
对于某些实现,编译器和运行时库由同一供应商/组织/人员提供,作为单个可安装包或作为两个单独的包。对于其他实现(包括 gcc),大部分标准库由底层操作系统提供,但编译器的安装包包含一些自己的 header 。
另一个示例:当您在 Solaris 上从源代码安装 gcc 时,安装程序会运行一个脚本,该脚本会获取一些现有头文件的副本(由 Sun 的 Oracle 运行时库提供)并编辑它们,然后安装修改后的副本位于单独的目录中。
在 GNU/Linux 系统上,默认的 C 编译器通常是 gcc,运行时库由 glibc 提供——两者都是 GNU 软件包,但单独开发。 Windows 下的 MinGW 实现使用 gcc 编译器和 Microsoft 的运行时库(这会导致一些问题,因为它们对 long double
的表示方式不一致)。
编译器需要提供哪些标准头文件的选择是由编译器的作者决定的。其实现与特定编译器紧密相关的 header (例如 <stdint.h>
、 <limits.h>
和 <float.h>
)通常由编译器提供;提供操作系统服务接口(interface)的 header ,例如 <stdio.h>
和<stdlib.h>
通常由运行时库或操作系统提供。
C 标准没有提供有关如何做出此选择的直接指导。
关于C header : compiler specific vs library specific?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24187603/