为什么C++;boost包只包含.hpp文件吗? 我是C++新手。我刚下载了Boost库来学习。我想了解一些实现细节,所以我查找了.cpp文件。令我惊讶的是,到目前为止我还没有找到

为什么C++;boost包只包含.hpp文件吗? 我是C++新手。我刚下载了Boost库来学习。我想了解一些实现细节,所以我查找了.cpp文件。令我惊讶的是,到目前为止我还没有找到,c++,boost,C++,Boost,那里似乎只有.hpp文件。.cpp文件在哪里?因为许多(但不是所有)库都是使用模板实现的,因此必须放在头文件中。来自: 大多数Boost库只包含头文件:它们完全由头文件组成 包含模板和内联函数的文件,并且不需要 单独编译的库二进制文件或特殊处理 链接 请参阅该链接,以获取不仅是标题而且必须单独构建的库的列表。对于这些库,.cpp文件位于的/libs目录中。如果您得到了预编译的包,您将在/lib目录中找到已经编译的.lib文件。对于那些不只是头文件的文件,可以在libs子目录中找到源文件。为了使用

那里似乎只有.hpp文件。.cpp文件在哪里?

因为许多(但不是所有)库都是使用模板实现的,因此必须放在头文件中。

来自:

大多数Boost库只包含头文件:它们完全由头文件组成 包含模板和内联函数的文件,并且不需要 单独编译的库二进制文件或特殊处理 链接


请参阅该链接,以获取不仅是标题而且必须单独构建的库的列表。对于这些库,.cpp文件位于的/libs目录中。如果您得到了预编译的包,您将在/lib目录中找到已经编译的.lib文件。

对于那些不只是头文件的文件,可以在
libs
子目录中找到源文件。

为了使用Boost类,.hpp文件是必须包含在代码中的头文件。许多Boost库都是头文件;所有的实现都在.hpp文件中。对于那些有源代码的,您只会看到编译后的版本为.lib文件

如果下载Boost的源发行版,它应该有几个子目录:

  • boost
    :包含.hpp头文件
  • lib
    :包含.lib文件(编译的实现细节)
  • libs
    :这些实现细节的来源

您可能正在查看预编译包,其中cpp文件以库的形式提供,而不是源代码。如果你真的抓取了,你会发现一些cpp文件。

很多Boost库都是纯模板。在以前的C++标准中,已经有关键字允许开发人员将实现与接口分开。
可悲的事实是,关键字从未完全起作用(从编译器供应商的角度来看,很难实现,也很难为开发人员正确使用它)。解决此问题的一种方法是在头文件中提供接口和实现,并避免使用实现文件。顺便说一句,为了使用它,您需要编译和链接几个Boost库,我打赌您会在这些库中找到实现文件。

我相信大多数Boost库只在实际的头文件中实现,正如前面的海报所提到的。如前所述,编译后的实现代码在与头文件分离时将作为单独的库文件包含

你提到C++是新的,所以我认为值得一提的是这种类型的库分发对于Boost不是特别的。您使用的其他第三方库和API的结构可能与此相同;您将只找到头文件和库文件包,没有.c、.cxx、.cpp等文件。这样做有很多原因,包括隐藏库功能的实现,以及允许共享库每次加载到内存中一次

这篇文章可能会帮助您澄清一些事情:

它不包含HPP文件,因为你必须链接一些库(例如BooStYb信号),我建议不要使用Boost实现细节作为C++学习指南。里面有一些非常离谱的东西。@John Dibling,但写得非常好。顺便说一句,我不知怎么错过了关于
/libs
目录的部分。编辑主要是为了将-1改为+1。为什么使用模板意味着放在头文件中?因为当模板实例化时,编译器会使用template参数创建一个新类。@Terry看一下讨论这个问题的文章。如果“所有实现都在hpp文件中”成立,你的回答似乎是唯一对我有意义的。它也是一个非常整洁的。为什么人们没有投票支持它?@razlebe我认为人们通常把界面放在标题中,把细节放在CPP中。不过有意思,谢谢@TerryLiYifeng我想我的答案可能有些混乱。希望澄清:“所有的实现都在hpp文件中”只适用于那些只包含头文件的库。对于其他库,源(.cpp文件)位于libs文件夹中,如中所述。如果您觉得合适,请随意切换答案。@Guerrero感谢您的跟进。这对我来说也是一个很好的答案,这解决了我的困惑,为什么它们在标题中同时提供接口和实现。