为啥同一个头文件必须包含两次?

Posted

技术标签:

【中文标题】为啥同一个头文件必须包含两次?【英文标题】:Why does the same header file have to be included twice?为什么同一个头文件必须包含两次? 【发布时间】:2014-06-24 17:13:34 【问题描述】:

我刚刚完成了一个程序,其中有一个 main.cpp 文件和我自己的静态库,我们称之为 myLib,它由 myLib.h 和一个 myLib.cpp 文件组成。

myLib.h 和 myLib.cpp 创建一个静态库。

在我的静态库中,我使用了一些 boost 函数和类,以便我自己的类和 myLib.cpp 中的函数可以做一些事情:所以我在 myLib.cpp 中添加了这些行

#include <boost/math/distributions/binomial.hpp>
#include <boost/math/tools/roots.hpp>

到 myLib.cpp

现在 myLib.h 包含函数声明和一些类定义,myLib.cpp 具有这些函数和类定义的实现,并且由于某些函数,需要在 myLib.h 中声明的类,#include "myLib. h”也必须添加到 myLib.cpp 文件中(我怀疑如果这些函数没有,那么 myLib.cpp 可以编译为目标文件而无需包含 myLib.h 文件,只要使用该对象的任何内容文件确实包含 myLib.h - 但由于某些函数使用这些类,因此 myLib.cpp 还包含 myLib.h)。实现文件是否可以要求将头文件编译为目标文件(然后包含到 .a 文件中)?我无法完全理解这是否不好 - 我认为他们应该是分开的?

【问题讨论】:

【参考方案1】:

这是完全正常的,事情是在 C/C++ 中完成的。头文件包含使用库所需的所有声明,源文件包含构建库所需的定义。这个源文件包含了classs的头文件,函数,需要在定义之前声明。

【讨论】:

【参考方案2】:

在 C++ 中,在包含实现的源文件中包含包含类声明的头文件是完全可以接受的。如果您想得更多,这是正常的,因为实现(cpp 文件)将没有其他方法可以了解类中的字段(变量)。

【讨论】:

【参考方案3】:

如果您在 2 个不同的(头文件和源文件)文件中实现您的类(通常是这种情况),那么是的,您绝对必须在源文件中包含头文件。如果你的类真的很轻,那么你可以在头文件中实现你的函数。这是不好的做法,并不真正推荐,所以我也不推荐。特别是在静态库的情况下,您应该将头文件分发给其他模块以便使用它。您不希望库使用者看到任何源代码。

【讨论】:

以上是关于为啥同一个头文件必须包含两次?的主要内容,如果未能解决你的问题,请参考以下文章

头文件重复包含(转)

为啥不包含头文件却可以调用函数,谁来解释

将头文件中的 typedef 枚举包含在另一个头文件中

C++将模板的声明和定义放置在同一个头文件里

C:防止头文件重复包含

为啥我的编译防护不能防止多个定义包含?