包括头文件和实现文件(c++)

including files in header vs implementation file (C++)

本文关键字:文件 c++ 实现 包括头      更新时间:2023-10-16

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

,

// 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路径未给出)