包括头文件与实现文件(C ++)中的文件

时间:2013-04-19 07:17:39

标签: c++ header implementation

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

这个

前:

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

class Test
{
    Test();
};

VS

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

Test::Test()
{
}

7 个答案:

答案 0 :(得分:3)

一般原则是您希望在合理可能的情况下尽量减少依赖关系,因此:

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

  • 如果您只引用实现(。cpp)中的给定标头(而不是在您的界面中),那么您应该只在实现中#include该标头

    < / LI>
  • 你也应该只尝试#include实际需要的标题,尽管这在大型项目的生命周期中很难维护

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

答案 1 :(得分:1)

如果要包含一些特定于实现的外部标头,最好将它们包含在cpp文件中,以减少API文件的标头依赖性。在cpp文件中包含第三方标题是数据隐藏的好方法,因此库用户不会对您的引用了解太多。

最好将头文件包含在需要它们的位置,以提高代码的合格性,并使您的项目可以轻松修改以供将来开发。

答案 2 :(得分:0)

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

我们使用:

    当lib / h文件在lib文件夹中可用时,
  • #include <>
  • #include ""当它出现在当前文件夹中时(未给出lib路径)

答案 3 :(得分:0)

唯一编译的是.cpp文件。

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

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

这就是发生的一切。

答案 4 :(得分: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()
{
}

答案 5 :(得分:0)

#include是一个简单的文字替代品。该行由所述文件的内容替换。因此,如果你在A.h中包含A.h,在C.cpp中包含B.h,那么A.h的内容最终将被粘贴到C.cpp中。

我们通常会尝试避免使用此类标头。通常可以使用前向声明。例如。 class Global;。基类是一个很大的例外。定义派生类的头必须包含基类的头。

答案 6 :(得分:0)

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

您应该确保标题中包含的文件说globals.h可以在包含test.h的地方访问。如果不是这种情况,那么在CPP文件中包含globals.h。