8

在头文件中包含头文件与在实现文件中包含头文件有什么区别?

这个

前任:

// test.h
#include"globals.h"

class Test
{
    Test();
};

对比

//test.cpp
#include"globals.h"

Test::Test()
{
}
4

7 回答 7

8

一般原则是您希望尽可能合理地减少依赖关系,因此:

  • 如果您的接口(.h) 引用了给定标头中的任何内容,则该标头需要在接口 (.h) 中#included

  • 如果你只在你的实现(.cpp)中引用一个给定的头文件(而不是在你的接口中),那么你应该只在实现中#include那个头文件

  • 您还应该尝试仅 #include 实际需要的标头,尽管这在大型项目的生命周期中可能难以维护

因此,对于上面的示例,如果您在 test.h 中没有引用 globals.h 中的任何内容,但在 test.cpp 中确实引用了它,那么#include 应该进入 test.cpp。如果您在 test.h 中引用 globals.h 中的任何内容,那么您需要 test.h 中的#include。

于 2013-04-19T07:21:18.170 回答
2

如果您包含一些特定于实现的外部头文件,您最好将它们包含在 cpp 文件中,以减少头文件对 API 文件的依赖。在 cpp 文件中包含第三方标头是一种隐藏数据的好方法,这样图书馆用户就不会对您的参考资料了解太多。

将头文件包含在需要它们的地方是一种很好的做法,以增加代码的资格并使您的项目易于修改以供将来开发。

于 2013-04-19T07:25:07.200 回答
0

没有区别。.h文件用于定义类和变量,而.cpp文件是实现。

我们用:

  • #include <>当 lib/h 文件在 lib 文件夹中可用时。
  • #include ""当它存在于当前文件夹中时..(未给出lib路径)
于 2013-04-19T07:21:18.890 回答
0

唯一编译的是.cpp文件。

实际上,这不是真的,从 生成的文件.cpp被编译。

生成此其他文件时,#include指令有效地将包含文件的内容复制并粘贴到生成的文件中。

这就是正在发生的一切。

于 2013-04-19T07:22:37.753 回答
0

据我所知,在源文件或头文件中包含头文件没有任何区别。请注意,#include 是一个预处理器宏,它所做的只是在包含头文件的位置替换头文件的内容。

在上面的示例中,如果 globals.h 看起来像这样,

#ifndef GLOBALS_H_
#define GLOBALS_H_

#define MYGLOBAL_VARIABLE 10

#endif /* GLOBALS_H_ */

预处理器完成其工作后的源文件将如下所示。

/* #include "globals.h" */
#ifndef GLOBALS_H_
#define GLOBALS_H_

#define MYGLOBAL_VARIABLE 10

#endif /* GLOBALS_H_ */

Test::Test()
{
}
于 2013-04-19T07:24:03.527 回答
0

#include是一个简单的文本替换。该行将替换为上述文件的内容。所以,如果你在 Bh 中包含 Ah,在 C.cpp 中包含 Bh,那么 Ah 的内容最终会被粘贴到 C.cpp 中。

我们通常会尽量避免这样的 headers-in-headers。通常可以使用前向声明来代替。例如class Global;。最大的例外是基类。定义派生类的标头必须包含基类的标头。

于 2013-04-19T07:27:04.820 回答
0

如果您以标头和库的形式将代码作为 API 提供,那么您必须确保定义接口的头文件中不包含内部私有头文件。在这种情况下,您将所有私有文件包含在 CPP 文件中,该文件将被编译并位于 .lib 或 .a 或 .dylib 文件中。否则这对使用你的 API 的用户来说是个问题。

您应该确保包含在标头中的文件 globals.h 可以在包含 test.h 的位置访问。如果不是这种情况,则在 CPP 文件中包含 globals.h。

于 2013-04-19T07:27:44.683 回答