将包含放在所有正确的位置

时间:2016-10-15 14:30:25

标签: c++ gcc linker header-files

因此,我们使用#include告诉编译器/链接器在哪里找到类的所有相关代码。

看看这个:

ClassC.h:
    #include "ClassA.h";

ClassD.h:
    #include "ClassC.h"

假设我们在ClassA中使用ClassD,但其方式与ClassC无关。我们通过包含ClassC隐式包含它,因此不会抛出任何错误。但是,如果代码更改并且不再需要ClassC(我们因此删除#include "ClassC.h"),我们会收到未定义的引用错误,因为ClassA现在未被引用。

有没有办法让编译器/链接器独立查看每个* .cpp和分配的* .h,而不查看包含的.h文件?

如果是这种情况,它不会调查ClassC.h并看到它包含ClassA.h,但会抛出错误或至少发出警告,告诉我我没有包含{{1} }}。这更有意义,因为,就ClassA.h类而言,ClassDClassA之间没有任何联系(在设定的假设下我独立使用ClassC ClassA)。

我认为以这种方式编写的代码会更稳定,更有弹性。不是吗?

另外,假设我们建立了一个项目,它的确有效。如果我们之前在代码中引用一些类(X)而不是之前引用的类,那么如果它正在使用某些其他类(Y)从程序中该点之间的某个其他源中包含,那么我们可能会收到错误。该类的前一次出现。如果我们捆绑包含更接近于明确使用它的每个头文件,那么这些错误将永远不会出现。

我知道我可以自己跟踪所有这些,但是在大型项目中,即使是中型项目,也会很容易错过一些或更多项目。此外,出现错误/警告会使管理变得更加容易。

我知道我的事情有点复杂,但对我来说这似乎是一个好习惯。

这甚至是一个好主意,可以以某种方式在编译器/链接器选项中设置(例如CodeBlocks中的GNU gcc编译器)吗?

1 个答案:

答案 0 :(得分:1)

  

假设我们在ClassD中使用ClassA,但绝不是这样   连接到ClassC。我们通过包括隐含地包括它   ClassC,所以不会抛出任何错误。但是,如果代码改变了   不再需要ClassC(我们删除#include“ClassC.h”   因为那样,我们会得到未定义的引用错误,因为ClassA是   现在没有参考。

如果您需要在ClassA中使用ClassD,请在#include "ClassA.h"明确 ClassD.h依赖隐式包含链。