我有一堆需要编写单元测试的遗留代码。由于几乎所有的.cpp文件都依赖于stdafx.h,这使得破坏依赖关系以编写测试变得非常困难。
我的第一反应是删除所有这些stdafx.h文件,因为它们大多只包含#include指令,然后根据需要直接将这些#includes放置在源文件中。
这将需要关闭预编译头文件,因为它们依赖于类似于stdafx.h的文件来确定预编译头文件停止的位置。
是否有一种方法可以保持预编译头文件而没有stdafx.h的依赖关系?是否有更好的解决此问题的方法?
我有一堆需要编写单元测试的遗留代码。由于几乎所有的.cpp文件都依赖于stdafx.h,这使得破坏依赖关系以编写测试变得非常困难。
我的第一反应是删除所有这些stdafx.h文件,因为它们大多只包含#include指令,然后根据需要直接将这些#includes放置在源文件中。
这将需要关闭预编译头文件,因为它们依赖于类似于stdafx.h的文件来确定预编译头文件停止的位置。
是否有一种方法可以保持预编译头文件而没有stdafx.h的依赖关系?是否有更好的解决此问题的方法?
不,可能没有更好的方法。
然而,对于给定的单个 .cpp 文件,你可能会决定不需要预编译头文件。你可以修改该文件的设置并删除 stdafx.h 行。
(实际上,我不知道预编译头文件方案如何干扰到你编写单元测试的过程)。
是的,"stdafx.h/stdafx.pch" 只是一种约定俗成的命名。你可以为每个 .cpp 文件创建自己的预编译头文件。最简单的方法可能是通过一个小脚本编辑你的 .vcproj 文件中的 XML。缺点是你会得到一大堆预编译头文件,并且它们不能在 TU 之间共享。
这样做是可行的,但是否明智我无法确定。
我的建议是 - 不要删除预编译头文件,除非你想让构建变得非常缓慢。在这里,你基本上有三个选择:
预编译头文件基于所有内容都将包含相同的设置的想法。如果您要利用预编译头文件,则必须接受这意味着的依赖关系。这涉及到依赖关系与构建速度之间的权衡。如果您可以在关闭预编译头文件的情况下在合理的时间内构建,则一定要这样做。
另一个要考虑的事情是您可以为每个库拥有一个pch。因此,您可能可以将代码分成较小的库,并使它们中的每一个具有更紧密的依赖关系集。
预编译头文件可以在重新构建项目时节省大量时间,但是如果预编译头文件发生更改,依赖于该头文件的每个源文件都将被重新编译,无论更改是否影响它。幸运的是,预编译头文件用于编译而不是链接;不必让每个源文件都使用相同的预编译头文件。
pch1.h:
#include <bigHeader1.h>
#include ...
pch1.cpp:
#include "pch1.h"
source1.cpp:
#include "pch1.h"
[code]
pch2.h:
#include <bigHeader2.h>
#include ...
pch2.cpp:
#include "pch2.h"
source2.cpp
#include "pch2.h"
[code]
选择 pch1.cpp,右键点击,属性,配置属性,C/C++,预编译头文件。
预编译头文件:创建(/Yc)
预编译头文件名:pch1.h
预编译头文件输出:$(intDir)pch1.pch
选择 source1.cpp
预编译头文件:使用(/Yu)
预编译头文件名:pch1.h
预编译头文件输出:$(intDir)pch1.pch (我认为这对于/Yu没有影响)
对于 pch2.cpp 和 source2.cpp 做同样的事情,只需将头文件和头文件输出设置为 pch2.h 和 pch2.pch。这对我有效。
我只在需要包含afx___相关内容的代码中使用预编译头文件,通常只有UI部分不需要进行单元测试。UI代码处理UI并调用具有单元测试的函数(尽管由于应用程序是遗留代码,大多数函数目前没有单元测试)。
对于大部分代码,我不使用预编译头文件。
G.