【问题标题】:Why is Boost.ProgramOptions not header-only? [closed]为什么 Boost.ProgramOptions 不是仅标头? [关闭]
【发布时间】:2017-03-15 13:49:38
【问题描述】:

一些 boost 库是只有头文件的,有些不是,以及出于各种原因等等。

Boost.ProgramOptions 不是仅标头有具体原因/设计决定吗?

我想知道,因为它在其文档中声称是一个“小型”库,我没有看到任何与系统相关的原因(如线程或 asio)。

【问题讨论】:

  • 也许我的回答是在光顾你。投赞成票,以便专家回答。
  • 我不知道它是否需要这样做,但看起来几乎所有代码都在 .cpp 文件中,甚至没有尝试仅作为标题:@987654321 @
  • 您可能想给 Vladimir Prus (vladimirprus.com) 发一封电子邮件,看看他是否有答案。
  • 我向 Boost.Serialization 的开发人员提出了同样的问题,实际上没有充分的理由这样做。当时,人们担心代码膨胀和编译时间过长。毫无疑问,任何非模板代码都会在 cpp 文件中。现在这些问题不那么严重了。一旦他们决定进行单独编译,他们就滥用了它,现在仅仅因为单例和静态变量之类的事情,就很难让它成为标题。虽然有时只能通过将 cpp 代码(从源代码)复制到 hpp 来使其成为标题。想试试吗?
  • 这里是仅用于处理程序选项的标头库,它声称具有与 Boost.ProgramOptions 类似的功能:github.com/rambler-digital-solutions/raconfig。所以没有根本原因不只是标题。还有 CLI11,只有标头,github.com/CLIUtils/CLI11/tree/v0.1

标签: c++ boost boost-program-options header-only


【解决方案1】:

Program Options 声称很小,但事实证明它是我们正在构建的第二大库,仅次于 Regex。 (它比 boost Filesystem 和 Thread 库更大。)我相信你应该很高兴他们正在为它构建一个库,而不是用大量包含的头文件阻塞你的项目。或许作者一开始以为会小,等到评论不断增长和增加功能时忘记改了。

【讨论】:

  • 为什么这个答案被否决了?这是一个很好的猜测,我实际上完全同意它......
【解决方案2】:

由于违反单一定义规则,并非所有 C++ 代码都可以只写在标头中。

例如,一个类的static 成员的存储预留需要恰好在一个翻译单元中(尽管未来的 C++ 标准可能会取消这一点)。

最初的意图是让 Boost 只是头球,但他们不得不迅速放弃这个愿望。

【讨论】:

  • 是的,我知道,正在寻找 Boost.ProgramOptions 的具体案例。
  • 因为它包含这样的构造,innit!
  • C++17 内联变量在当时当然是不可能的,但是可以用静态类模板成员来模拟它们。
  • @Quentin:如果 boost 只是标题,那就太可惜了。 bjam 和 b2 是一个学习曲线。想象一个不再需要这些知识的世界:-(
猜你喜欢
  • 2021-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-02
  • 2014-09-12
  • 2015-08-04
  • 2013-11-25
相关资源
最近更新 更多