包括头文件和实现文件(c++)
including files in header vs implementation file (C++)
在头文件中包含头文件与在实现文件中包含头文件的区别是什么?
,
// test.h
#include"globals.h"
class Test
{
Test();
};
和
//test.cpp
#include"globals.h"
Test::Test()
{
}
一般原则是您希望尽可能减少依赖,因此:
-
如果你的接口 (.h)引用了给定标头中的任何内容,那么该标头需要#include在接口(.h)
-
如果你只在实现 (.cpp)(而不是在你的接口)中引用一个给定的头文件,那么你应该只在实现
中#包含该头文件 你也应该尝试只包含实际需要的头文件,尽管这在一个大型项目的生命周期中很难维护
对于上面的例子,如果你没有在test.h中引用global .h中的任何内容,但是你在test.cpp中引用了它,那么#include应该放在test.cpp中。如果在test.h中引用了global .h中的任何内容,则需要在test.h中添加#include。
如果您包含一些特定于实现的外部头文件,您最好将它们包含在cpp文件中,以减少头文件对API文件的依赖。在cpp文件中包含第三方头文件是一种隐藏数据的好方法,这样库用户就不会知道太多关于引用的信息。
在需要的地方包含头文件是一个很好的做法,以增加代码的合格性,并使您的项目易于修改,以供将来的开发使用。
唯一编译的是.cpp
文件。
实际上,这不是真的,从.cpp
生成的文件被编译。
在生成另一个文件时,#include
指令有效地将include文件的内容复制粘贴到生成的文件中。
就是这些
#include
是一个简单的文本替换。该行被上述文件的内容所替换。因此,如果在B.h中包含A.h,在c.p中包含B.h,那么A.h的内容最终将被粘贴到c.p中。
我们通常会尽量避免这样的头中头。通常可以使用前向声明来代替。例:class Global;
。最大的例外是基类。定义派生类的头文件必须包含基类的头文件。
如果你以头文件和库的形式提供你的代码作为API,那么你必须确保在你的头文件中没有定义接口的内部私有头文件。在这种情况下,您将所有私有文件包含在CPP文件中,该文件将被编译,并将在.lib或.a或.dylib文件中。否则,对于使用您的API的用户来说,这将是一个问题。
您应该确保在包含test.h的地方可以访问头文件中包含的文件global .h。如果不是这种情况,则在CPP文件中包含globals.h。
据我所知,在源文件和头文件中包含头文件没有任何区别。注意#include是一个预处理器宏,它所做的只是在包含它的位置替换头文件的内容。
在上面的例子中,如果global .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()
{
}
没什么区别。.h
文件用于定义类和变量,而.cpp
文件用于实现。
:
-
#include <>
当lib/h文件在lib文件夹中可用时。 -
#include ""
,当它存在于当前文件夹。(lib路径未给出)
- .cpp和.h文件中的模板专用化声明
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 文本文件中的单词链表
- CMake-按正确顺序将项目与C运行时对象文件链接
- 使用新行和不使用新行读取文件
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 挂起和取消挂起一个文件DLL
- 如何确定我已使用非编码文件到达 EOF?
- 命名空间中具有.h和.cpp文件的类
- 如何使用ndk-build.cmd构建Android.so文件
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 读取文件并输入到矢量中
- 在C++中查找文件
- c++库的公共头文件中应该包含什么
- 用c++从输入文件中读取另一行
- Cppcheck生成xml转储文件
- 读取文件的最后一行并输入到链接列表时出错
- 无法编译 rtmidi 测试 cmidiin.cpp 文件, 非法指令
- 如何将内容数组写入文本文件?
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到