c++ - #将所有 .cpp 文件包含在一个编译单元中?

想要改进这篇文章? 提供这个问题的详细答案,包括引用和解释为什么你的答案是正确的。没有足够细节的答案可能会被编辑或删除。

我最近有理由使用通常的 Debug 和 Release 配置以及“Release All”和“Debug All”的一些 Visual Studio C++ 项目,这是我以前从未见过的。

事实证明,项目的作者有一个 ALL.cpp,其中 #includes 所有其他 .cpp 文件。 *All 配置只是构建这个 ALL.cpp 文件。它当然排除在常规配置之外,常规配置不会构建 ALL.cpp

我只是想知道这是否是一种常见的做法?它带来什么好处? (我的第一 react 是闻起来很臭。)

您可能会遇到什么样的陷阱?我能想到的一个问题是,如果您的 .cpp 中有匿名命名空间,它们不再是该 cpp 的“私有(private)”,但现在在其他 cpp 中也可见?

所有项目都构建 DLL,因此在匿名命名空间中存储数据不是一个好主意,对吧?但是功能就可以了?

最佳答案

它被一些人(和谷歌)称为“Unity Build”。它的链接速度非常快,编译速度也相当快。它非常适合您不需要迭代的构建,例如来自中央服务器的发布构建,但它不一定适用于增量构建。

这是一个需要维护的 PITA。

编辑:这是获取更多信息的第一个谷歌链接:http://buffered.io/posts/the-magic-of-unity-builds/

让它快速的原因是编译器只需要读取所有内容一次,编译出来,然后链接,而不是对每个 .cpp 文件都这样做。

Bruce Dawson 在他的博客上对此进行了更好的描述:http://randomascii.wordpress.com/2014/03/22/make-vc-compiles-fast-through-parallel-compilation/

https://stackoverflow.com/questions/543697/

相关文章:

visual-studio-2010 - 除非我手动选择 "Rebuild",否则 Visual S

build - 如何从 Jenkins 的另一份工作中提升特定的内部版本号?

android - Android 应用中的自动递增版本代码

linux - 典型的 ./configure 在 Linux 中做了什么?

c# - 使用 Visual Studio 2010 从命令行构建 C# 解决方案

c# - Await 运算符只能在 Async 方法中使用

java - 何时使用 gradle.properties 与 settings.gradle?

visual-studio - 为什么在 Visual Studio 中执行之前 F5 不重建项目?

Xcode 构建警告 - 目标完整性 - 配置文件仅针对 ProjectnameTests 目标到期

visual-studio-2010 - Visual Studio 2010 说在我更改源文件后构