小编典典

为什么 C++ 需要单独的头文件?

all

我从来没有真正理解为什么 C++ 需要一个单独的头文件,它具有与 .cpp
文件中相同的功能。它使创建类和重构它们变得非常困难,并且它向项目中添加了不必要的文件。然后是必须包含头文件的问题,但必须明确检查它是否已经包含在内。

C++ 是在 1998 年被批准的,那么为什么要这样设计呢?拥有单独的头文件有什么好处?


跟进问题:

当我只包含 .h 文件时,编译器如何找到其中包含代码的 .cpp 文件?它是否假定 .cpp 文件与 .h
文件具有相同的名称,或者它实际上是否查看了目录树中的所有文件?


阅读 130

收藏
2022-07-29

共1个答案

小编典典

您似乎在询问如何将定义与声明分开,尽管头文件还有其他用途。

答案是 C++
并不“需要”这个。如果您将所有内容标记为内联(对于在类定义中定义的成员函数,这无论如何都是自动的),那么就不需要分离。您可以在头文件中定义所有内容。

您可能 想要 分开的原因是:

  1. 改善构建时间。
  2. 在没有定义源的情况下链接代码。
  3. 避免将所有内容标记为“内联”。

如果您更普遍的问题是“为什么 C 与 Java 不同?”,那么我不得不问,“为什么您要编写 C 而不是 Java?” ;-p

然而,更严重的是,原因是 C++ 编译器不能像 javac
那样直接进入另一个翻译单元并弄清楚如何使用它的符号。需要头文件向编译器声明它可以期望在链接时可用的内容。

#include直接的文本替换也是如此。如果您在头文件中定义所有内容,预处理器最终会为项目中的每个源文件创建一个巨大的副本和粘贴,并将其输入编译器。C
标准在 1998 年获得批准的事实与此无关,这是因为 C
的编译环境如此紧密地基于 C 的编译环境。

转换我的评论以回答您的后续问题:

编译器如何找到包含代码的 .cpp 文件

它没有,至少在它编译使用头文件的代码时没有。您链接的函数甚至不需要编写,更不用说编译器知道.cpp它们将在哪个文件中。调用代码在编译时需要知道的所有内容都在函数声明中表示。在链接时,您将提供.o文件列表,或者静态或动态库,并且有效的标题是对函数定义将在某处的承诺。

2022-07-29