C header : compiler specific vs library specific?

标签 c gcc header-files standard-library

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/

相关文章:

C - 如何运行一个线程几秒钟,然后继续运行第二个线程

c - 读取套接字

c - fgets 被跳过/不停止输入

c - gcc 编译的 main() 中无用序言的动机,禁用它?

c - gcc在调用前从esp中减去

r - 如何安装/定位 R.h 和 Rmath.h 头文件?

c++ - 如何正确地将 ed25519-donna 与 c++ 链接起来? (-mbits 标志在哪里?)

将十六进制字符串转换为 signed int 会在不同平台上产生不同的值

没有扩展名的 C++ 头文件

c++ - 使用继承时是否需要 "#include"子类父类的头文件。 C++