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

标签 c++ visual-studio build

我最近有理由使用通常的 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/

关于c++ - #将所有 .cpp 文件包含在一个编译单元中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/543697/

相关文章:

eclipse - 当代码的某些部分发生变化时,是否有任何工具可以自动重建项目?

c++ - 我正在用 C++ 创建一个 DLL,但它给我一个持久性错误

.net - 使用 .NET (C#) 时,用于调试/发布输出的单独文件夹还是相同文件夹?

c++ - 找不到 operator= 的匹配项(在 vector<string> 中查找值)

vb.net - Visual Studio 2013 每次都进行不必要的构建并且速度很慢

c - 如何从 Visual Studio C 编译器获得更有用的警告?

ruby - 我如何从另一个 rake 文件修改/扩展一个 rake 文件?

eclipse - 在为项目构建不同的 Eclipse CDT 共享资源文件夹中

c++ - 具有内置 CUDA 库/功能的 OpenCV-3

c++ - 使用 CreateFile 打开文件*