为啥同一个头文件必须包含两次?
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++ 中完成的。头文件包含使用库所需的所有声明,源文件包含构建库所需的定义。这个源文件包含了class
s的头文件,函数,等需要在定义之前声明。
【讨论】:
【参考方案2】:在 C++ 中,在包含实现的源文件中包含包含类声明的头文件是完全可以接受的。如果您想得更多,这是正常的,因为实现(cpp 文件)将没有其他方法可以了解类中的字段(变量)。
【讨论】:
【参考方案3】:如果您在 2 个不同的(头文件和源文件)文件中实现您的类(通常是这种情况),那么是的,您绝对必须在源文件中包含头文件。如果你的类真的很轻,那么你可以在头文件中实现你的函数。这是不好的做法,并不真正推荐,所以我也不推荐。特别是在静态库的情况下,您应该将头文件分发给其他模块以便使用它。您不希望库使用者看到任何源代码。
【讨论】:
以上是关于为啥同一个头文件必须包含两次?的主要内容,如果未能解决你的问题,请参考以下文章