在头文件中包含头文件与在实现文件中包含头文件有什么区别?
这个
前任:
// test.h
#include"globals.h"
class Test
{
Test();
};
对比
//test.cpp
#include"globals.h"
Test::Test()
{
}
在头文件中包含头文件与在实现文件中包含头文件有什么区别?
这个
前任:
// test.h
#include"globals.h"
class Test
{
Test();
};
对比
//test.cpp
#include"globals.h"
Test::Test()
{
}
一般原则是您希望尽可能合理地减少依赖关系,因此:
如果您的接口(.h) 引用了给定标头中的任何内容,则该标头需要在接口 (.h) 中#included
如果你只在你的实现(.cpp)中引用一个给定的头文件(而不是在你的接口中),那么你应该只在实现中#include那个头文件
您还应该尝试仅 #include 实际需要的标头,尽管这在大型项目的生命周期中可能难以维护
因此,对于上面的示例,如果您在 test.h 中没有引用 globals.h 中的任何内容,但在 test.cpp 中确实引用了它,那么#include 应该进入 test.cpp。如果您在 test.h 中引用 globals.h 中的任何内容,那么您需要 test.h 中的#include。
如果您包含一些特定于实现的外部头文件,您最好将它们包含在 cpp 文件中,以减少头文件对 API 文件的依赖。在 cpp 文件中包含第三方标头是一种隐藏数据的好方法,这样图书馆用户就不会对您的参考资料了解太多。
将头文件包含在需要它们的地方是一种很好的做法,以增加代码的资格并使您的项目易于修改以供将来开发。
没有区别。.h
文件用于定义类和变量,而.cpp
文件是实现。
我们用:
#include <>
当 lib/h 文件在 lib 文件夹中可用时。#include ""
当它存在于当前文件夹中时..(未给出lib路径)唯一编译的是.cpp
文件。
实际上,这不是真的,从 生成的文件.cpp
被编译。
生成此其他文件时,#include
指令有效地将包含文件的内容复制并粘贴到生成的文件中。
这就是正在发生的一切。
据我所知,在源文件或头文件中包含头文件没有任何区别。请注意,#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()
{
}
#include
是一个简单的文本替换。该行将替换为上述文件的内容。所以,如果你在 Bh 中包含 Ah,在 C.cpp 中包含 Bh,那么 Ah 的内容最终会被粘贴到 C.cpp 中。
我们通常会尽量避免这样的 headers-in-headers。通常可以使用前向声明来代替。例如class Global;
。最大的例外是基类。定义派生类的标头必须包含基类的标头。
如果您以标头和库的形式将代码作为 API 提供,那么您必须确保定义接口的头文件中不包含内部私有头文件。在这种情况下,您将所有私有文件包含在 CPP 文件中,该文件将被编译并位于 .lib 或 .a 或 .dylib 文件中。否则这对使用你的 API 的用户来说是个问题。
您应该确保包含在标头中的文件 globals.h 可以在包含 test.h 的位置访问。如果不是这种情况,则在 CPP 文件中包含 globals.h。