c++ - 有没有办法在不需要 stdafx.h 的情况下在 C++ 中使用预编译头文件?

标签 c++ unit-testing dependencies precompiled-headers stdafx.h

我有一堆遗留代码需要为其编写单元测试。它到处都使用预编译的头文件,因此几乎所有 .cpp 文件都依赖于 stdafx.h,这使得打破依赖性以编写测试变得困难。

我的第一直觉是删除所有这些 stdafx.h 文件,这些文件大部分包含 #include 指令,并根据需要将这些 #include 直接放在源文件中。

这将有必要关闭预编译头文件,因为它们依赖于像 stdafx.h 这样的文件来确定预编译头文件的停止位置。

有没有办法在没有 stdafx.h 依赖项的情况下保留预编译的头文件?有没有更好的方法来解决这个问题?

最佳答案

是的,有更好的方法。

恕我直言,预编译 header 的“向导式”问题在于它们鼓励不必要的耦合并使重用代码变得比应有的困难。此外,使用“将所有内容都粘贴到 stdafx.h”风格编写的代码很容易维护起来很痛苦,因为更改任何头文件中的任何内容都可能导致整个代码库每次都重新编译。这可能会使简单的重构永远耗时,因为每次更改和重新编译周期都比应有的时间长得多。

再次恕我直言,更好的方法是使用#pragma hdrstop 和/Yc 和/Yu。这使您能够轻松设置使用预编译头文件的构建配置,以及不使用预编译头文件的构建配置。使用预编译头的文件不直接依赖于源文件中的预编译头本身,这使得它们可以在有或没有预编译头的情况下构建。项目文件确定哪个源文件构建预编译头,每个源文件中的 #pragma hdrstop 行确定哪些包含来自预编译头(如果使用)以及哪些直接来自源文件...这意味着当进行维护时,您将使用不使用预编译 header 的配置,并且只有在 header 文件更改后需要重建的代码才会重建。在进行完整构建时,您可以使用预编译头配置来加快编译过程。使用非预编译 header 构建选项的另一个好处是,它可以确保您的 cpp 文件仅包含他们需要的内容并包含他们需要的所有内容(如果您使用预编译 header 的“向导样式”,这很难做到。

我在这里写了一些关于它是如何工作的:http://www.lenholgate.com/blog/2004/07/fi-stlport-precompiled-headers-warning-level-4-and-pragma-hdrstop.html (忽略关于/FI 的内容)我有一些使用 #pragma hdrstop 和/Yc/Yu 方法构建的示例项目:http://www.lenholgate.com/blog/2008/04/practical-testing-16---fixing-a-timeout-bug.html .

当然,从“向导风格”的预编译头文件使用到更受控制的风格通常很重要……

关于c++ - 有没有办法在不需要 stdafx.h 的情况下在 C++ 中使用预编译头文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/290034/

相关文章:

c# - 使用 Mock 进行单元测试。父级没有默认构造函数

c++ - 求解后缀表示法方程 c++

c++ - 程序如何验证加密文件的密码?

unit-testing - Clojure "is"断言未按预期工作

unit-testing - 如何在 Go 中为结构编写模拟

Maven:冲突的 jar 依赖项

c++ - Visual Studio : how to handle project dependencies right?

java - 在 Intellij IDEA 图上查找两个类之间的依赖关系链

c++ - 如何使用 OpenSSL 库生成 RSA-SHA256 数字签名?

c++ - 在基于对话框的 MFC 应用程序中保存和恢复元素状态