把包括放在所有正确的地方

Putting includes in all the right places

本文关键字:包括放      更新时间:2023-10-16

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

看看这个:

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

假设我们在ClassD中使用ClassA,但是以一种与ClassC没有任何联系的方式。通过包含ClassC,我们隐式地包含了它,因此不会抛出错误。但是,如果代码改变并且不再需要ClassC(并且我们因此删除了#include "ClassC.h"),我们将得到未定义的引用错误,因为ClassA现在未被引用。

是否有一种方法可以让编译器/链接器独立查看每个*.cpp和分配的*.h,而无需查看包含的。h文件?

如果是这种情况,它不会查看ClassC.h并看到它包含ClassA.h,而是抛出错误或至少警告告诉我没有包含ClassA.h。这更有意义,因为就ClassD类所知,ClassAClassC彼此之间没有连接(在set假设下,我独立于ClassC使用ClassA)。

我认为以这种方式编写的代码将更加稳定和灵活。不是吗?

同样,假设我们建立了一个项目,并且它有效。如果我们要在代码中引用某个类(X),而不是之前引用它,那么如果它正在使用其他源中包含的其他类(Y),则可能会得到一个错误,该类在程序中该点和该类之前第一次出现之间。如果我们将include更紧密地绑定到显式使用它的每个头文件,这样的错误就永远不会出现。

我知道我可以自己跟踪所有这些,但是在大型项目中,甚至是中型项目中,很容易错过一些或更多。此外,有一个错误/警告会使它更容易管理。

我知道我把事情弄复杂了一点,但这对我来说似乎是一个很好的实践。

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

假设我们在类d中使用类a,但以一种不可能的方式连接到ClassC。我们通过包含隐含地包含了它ClassC,因此不会抛出错误。但是,如果代码更改和不再需要ClassC(并且我们删除了#include "ClassC.h")因此,我们会得到未定义的引用错误,因为ClassA是现在未引用。

如果您需要在ClassD中使用ClassA,那么在ClassD.h中显式地使用 #include "ClassA.h"不要依赖于隐式包含链。