为什么我不应该将我的 #include 语句放在 .h 文件中?



我一直将#include语句放在头文件中,然后只在main中包含头,以使我的主文件看起来更干净。然而,我看到的每一个其他C++代码都主要保留它们。这两种方式都有区别吗?如果是,为什么?示例:

标题:

#pragma once
#include <iostream>
#include <string>
#include <iomanip>
#include <fstream>
using namespace std;
class Question
{
private:

Main:

#include "Header.h"
int main()
{

有几个注意事项:

  1. 您希望最大限度地减少标头包含,因为它们会减慢构建速度,并增加依赖树。包含标头的代码取决于它所包含的每个标头,以及它们所包含的每一个标头,依此类推。假设某个用户包含了你的头,而你在其中包含了20个其他头,那么

    • 任何时候任何包含的头都会发生更改,客户端代码必须重新编译
    • 客户端代码每次构建时都必须解析所有这些头

    真正的问题是倍增效应:构建速度较慢,而也必须更频繁地进行构建(因为依赖的文件数量增加了(。这也是c++项目构建速度如此缓慢的部分原因。有些标头包含大量复杂的模板代码,并且会针对出现的每个翻译单元进行反复编译。

  2. 标头包含的内容越少,所依赖的实现细节也就越少。";在标题中放入大量代码"往往会使它们包含比必要的更多的实现细节。也就是说,与其仅仅声明一个函数,不如定义函数,这意味着开发工作发生在头文件中,而不是cpp文件中。因此,这使得标头更改的频率甚至更高,导致包含它的每个人都需要重建,因为(通常(没有充分的理由。

  3. 当您在.cpp文件中隔离include时,那么只有该cpp文件对它有依赖性,而不是您的用户。这有助于隔离您的客户端,使其不必解析和构建使用但不需要提供的标头。

  4. 标头中包含的内容越多,也会使更多的名称对使用者代码可见。这可能会增加名称冲突,造成歧义,可能会让宏干扰,等等。命名空间可能会有所帮助,但如果用户获得100个重载运算符<lt;因为它们包括您的头,所以每次它们需要解决重载<lt;,编译器有100倍以上的函数可供选择,以决定调用哪一个,这同样会减慢构建速度。等等。

目标是最小化您向用户公开的内容,而标头就是您公开的内容。

只将所需的最小#include放在.h文件中。这样可以防止意外的代码冲突和不必要的make依赖关系。

它只会对更大的项目产生影响。如果你在头中包含了很多头,并且有很多源文件,那么你会多次包含头。这会大大增加编译时间。

对于小型项目(约10000条线路(,无论哪种方式都可以。

最新更新