gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 11:35:13 24 4
gpt4 key购买 nike

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

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


跟进问题:

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

最佳答案

有些人认为头文件是一种优势:

  • 据称它启用/强制/允许分离接口(interface)和实现 - 但通常情况并非如此。头文件充满了实现细节(例如,一个类的成员变量必须在头文件中指定,即使它们不是公共(public)接口(interface)的一部分),并且函数可以并且通常是内联定义的 标题中的类声明,再次破坏了这种分离。
  • 有时据说可以提高编译时间,因为每个翻译单元都可以独立处理。然而,就编译时间而言,C++ 可能是现存最慢的语言。部分原因是同一标题的许多重复包含。多个翻译单元包含大量 header ,需要对其进行多次解析。

最终, header 系统是 70 年代设计 C 时的产物。那时,计算机的内存非常少,将整个模块保存在内存中并不是一种选择。编译器必须从顶部开始读取文件,然后线性处理源代码。 header 机制实现了这一点。编译器不必考虑其他翻译单元,只需从上到下读取代码即可。

为了向后兼容,C++ 保留了这个系统。

今天,这毫无意义。它效率低下、容易出错且过于复杂。如果是目标的话,还有更好的方法来分离接口(interface)和实现。

然而,C++0x 的其中一项建议是添加一个适当的模块系统,允许将代码编译为类似于 .NET 或 Java 的更大模块,一次完成且无需 header 。这个提议在 C++0x 中没有被淘汰,但我相信它仍然属于“我们愿意稍后再做”的类别。也许在 TR2 或类似版本中。

关于c++ - 为什么 C++ 需要单独的头文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1305947/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com