C - 头文件
Posted
技术标签:
【中文标题】C - 头文件【英文标题】:C - Header files 【发布时间】:2017-10-13 23:23:57 【问题描述】:C需要不同的头文件,如stdio.h、stdlib.h、fcntl.h等。对于不同的函数和结构定义,这是为什么呢?在底层,这一切都归结为 libc 那么为什么不创建一个包含所有定义和原型的头文件呢?
【问题讨论】:
在这种情况下,每个编译单元都会太大,编译器会花费很多时间来编译这样的单元。 它不需要它们。他们只是让生活更轻松。 这并不是因为某些事情是可能的,它也会是理智的 :) 仅使用一个标题来维护将是一场噩梦。 在极少数情况下,头文件实际上是矛盾的。这种情况很少见,但一个例子是如果您在 linux 中使用 termios2 结构,请参阅***.com/questions/37710525/… 这里没有人提到真正的原因:因为 C 是在 1970 年代设计的,当时从磁盘读取头文件所花费的时间实际上意味着什么。现在你可以组合所有的头文件,它们仍然会在几毫秒内被读取。那时,拥有不需要的头文件可能会使您的编译时间延长几秒钟。 【参考方案1】:这些文件由 C 标准库提供,以便更轻松地完成常见任务。至于为什么将声明和定义保存在单独的文件中,这是出于方便和可维护性的原因。同样的原因,例如,Linux 内核没有在单个 C 文件中定义,尽管理论上它可以。
【讨论】:
stdio.h 和 stdlib.h 是 C 标准所要求的,此外还有其他几个头文件。 它们实际上是 C 标准所要求的。 实际上,独立实现中不需要 stdio.h 和 stdlib.h。它们在托管实施中是必需的。 fcntl.h 不是标准的。 查看标准中的一致性章节。正如任何从事嵌入式系统工作的人都知道的那样,在所谓的独立实现中,这些头文件不是一致性所必需的。类型定义标题是唯一需要的。但由于这句话似乎有争议,我已将其删除,因为它甚至与问题无关。【参考方案2】:单独的头文件的定义方式主要是由于历史兼容性。 C 语言在标准化之前已经在各种平台上使用。
单独的头文件背后的基本原理可能是模仿 C 语言中的模块化的一种方式。单独的头文件定义了模块提供的功能。这与其他语言提供功能的方式没有太大区别。
C 也有极简主义的哲学,因此要求每个翻译单元编译所有可用函数的原型声明,无论它们是否会被使用似乎有些过分。
【讨论】:
正确答案 - 主要反映很久以前的设计目标和编译器性能/能力。【参考方案3】:C 不需要这些东西。
如果您愿意,可以手动将任何头文件的内容复制到每个源文件中,而无需头文件。但是,这很容易出错 - 如果其中一个源文件发生更改,通常需要更新所有源文件,这样很容易出现拼写错误。(如果将标准头文件的内容复制到所有编译中单位,如果使用不同的编译器/库构建您的代码也可能会失败,因为头文件的内容因实现而异)。
包含头文件只是一种技术,它允许将头文件的内容(有效地)复制并粘贴到包含它的每个源文件中 - 所有源文件都获得相同的内容(除非某些其他预处理器宏导致问题有条件地发生)。对于有助于可移植性的标准头文件(尤其是那些提供只能在不同系统上以不同方式实现的功能的头文件)。
【讨论】:
以上是关于C - 头文件的主要内容,如果未能解决你的问题,请参考以下文章