3

最近观看的 CppCon 2017 视频:Boris Kolpackov “构建 C++ 模块” https://www.youtube.com/watch?v=E8EbDcLQAoc

大约在 31 点 35 分,他开始解释我们仍然应该使用标头/源拆分,并展示了 3 个原因。第一个原因:

如果您在触摸此模块时将两个声明/定义放在同一个位置,则将重新编译依赖于模块接口(BMI) 的所有其他模块。

我一点也不喜欢。听起来我们还处于 90 年代,编译器还不够聪明,无法看到与 BMI 相关的更改和与实现相关的更改的差异。正如我所看到的,编译器能够快速扫描每个模块并从中仅生成 BMI。如果 BMI 没有改变 - 不要重新编译依赖它的其他模块。

还是我错过了什么?

4

1 回答 1

4

那次谈话的作者后来说,重新编译问题是一个实现问题。引用 Boris Kolpackov的文章Common C++ Modules TS Misconceptions

事实证明,很多人希望摆脱头文件/源代码拆分(或者,在模块方面,接口/实现拆分)并将所有内容保存在一个文件中。您可以在 Modules TS 中执行此操作:使用模块(与标头不同),您可以在模块接口单元中定义非内联函数和变量。因此,如果您想将所有内容保存在一个文件中,您可以.

现在,将所有内容保存在单个文件中可能会对构建性能产生负面影响,但看起来足够智能的构建系统与编译器合作应该能够克服这个问题。有关详细信息,请参阅此讨论

从链接的线程中引用Gor Nishanov(Coroutines TS 的项目编辑器):

这取决于您如何构建代码。Module TS 不会强加您如何将模块分解为单个文件。如果需要,您可以在接口文件中实现整个模块(因此您将拥有类似 C# 的经验),或者您可以将模块划分为一个接口和一个或多个实现文件。

Modules TS的项目编辑Gabriel Dos Reis评论了 MSVC 的实施

理想情况下,只有与语义相关的更改才会触发以 IFC 为键的重新编译。

(附带说明一下,模块 TS现已获得批准并发送给 ISO 以供发布。)

于 2018-02-02T18:11:20.423 回答