在头文件中包含头文件与在实现文件中包含头文件有什么区别?
这个
前:
// test.h
#include"globals.h"
class Test
{
Test();
};
VS
//test.cpp
#include"globals.h"
Test::Test()
{
}
答案 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
文件是实现。
我们使用:
#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。