C++头文件没有包含任何其他头文件的任何充分理由?

use*_*878 6 c++ coding-style header-files

我已经看到一个标题包含这样的样式,其中头文件不包含其他头文件,相应的*.cpp文件必须包含所有依赖项(并按正确的顺序包含它们).在过去的好日子里,这可能会使构建依赖性跟踪变得更容易(但我只是在猜测).现在有充好的理由吗?

档案"Bh":

#ifndef _B_h_
#define _B_h_

// Note we do not #include "A.h" that contains class A declaration.

class B
{
public:
   A a; // An A object.
};
#endif // _B_h_
Run Code Online (Sandbox Code Playgroud)

文件"B.cpp":

#include "A.h" // Must include this before B.h, otherwise class A not defined in B.h
#include "B.h"

...
Run Code Online (Sandbox Code Playgroud)

Set*_*gie 8

是的,这将是不好的做法,因为如果某人得到错误的订单,他们将得到他们可能或可能无法弄清楚的错误.如果所有头文件都包含防护,那么包含所需的所有其他头的一个头将不会成为问题,这应该是怎样的.


And*_*ron 5

似乎无论谁编写该代码都误解了减少包含标题数量的共同建议.通常建议删除不必要的 #include <>指令,以期加速编译.实际上,在大型项目中,它可能会通过以下方式显着加速编译:

  1. 减少编译器打开以编译任何给定源文件所需的头文件数量;
  2. 减少标题更改后需要重新编译的源文件数.

一般来说,除非相关标题中定义的类是:否则人们会建议(使用我所参与的所有项目的编码标准)使用前向声明.

  1. 用作基类;
  2. 用作数据成员;
  3. 有一个不完整的官方说明(例如,标准库容器只要有默认值就允许有额外的模板参数,因此转发声明它们是非标准的).

在情况1和2中,#include <>指令必须出现在所有相关源文件和标头中的类定义之前.基本上,它只是将#include <>指令从头部移动到每个依赖项中.它会产生更多的代码并且没有任何好处(例如编译时间等).出于这个原因,此建议还伴随着编码标准中的另一个条目:每个头文件应编译"独立"(例如,包括在源文件的第一行).