C++ 包括来自其他项目的stdafx.h

C++ 包括来自其他项目的stdafx.h,c++,visual-studio-2008,C++,Visual Studio 2008,在VisualStudio解决方案中,我有两个vcproj,一个叫做kernellib.vcproj,另一个叫做kernerlibtest.vcproj。正如您所猜测的,后者是前者的单元测试项目 现在,kernellib.vcproj使用预编译头,所有慢WINAPI包含的都位于stdafx.h中。这是为了确保kernelib能够快速编译 现在,由于kernerlibtest.vcproj也使用了相同的一组include,我还想对kernerlibtest.vcproj执行这个速度技巧,我如何配置

在VisualStudio解决方案中,我有两个vcproj,一个叫做
kernellib.vcproj
,另一个叫做
kernerlibtest.vcproj
。正如您所猜测的,后者是前者的单元测试项目

现在,
kernellib.vcproj
使用预编译头,所有慢WINAPI
包含的
都位于
stdafx.h
中。这是为了确保kernelib能够快速编译


现在,由于
kernerlibtest.vcproj
也使用了相同的一组include,我还想对
kernerlibtest.vcproj
执行这个速度技巧,我如何配置我的vcproj和解决方案文件来做到这一点呢?

在这里启用它:
Project->Properties->Configuration Properties->C/C++->。将选项“不使用预编译头”更改为“使用/Yu”。

(这就是它在vs2010中的实现方式,希望在vs2008中也能如此)

有很多方法可以让它发挥作用。以下是我的建议:

  • “stdafx.h”(或者您如何称呼预编译头)应该是每个模块的内部头
  • 您应该只在stdafx.h中包含很少变化的标题,这些内容变化不大
  • 您应该严格地将其视为优化
  • 仅包括.c/cpp文件中的stdafx.h,而不包括任何公共头
  • 如果您的头依赖于HWND等定义,则仍应在公共头中包含stdlib/winapi头。这不会降低库的编译速度,因为您首先要包含预编译头
  • 在用于kernerlibtest的stdafx.h中,您甚至可以包含kernerlib.h(依赖项的公共头)。如果频繁修改kernerlib.h,您将一无所获。
    • 如果您在工作树中嵌套了一个大型第三方库,这将非常有用

但这将引用
kernerlibtest.vcproj
中的
stdafx.h
,而不是
kernerlib.vcproj
中的
stdafx.h
,对吗?抱歉,我最初误解了你的问题。我认为stdafx.h将为您的项目重新计算。我在一个有几个项目的大型解决方案上工作,我看到的第一条src构建消息是“ClCompile:stdafx.cpp”;如果您已将kernellib的.h文件添加到项目中,我认为它们应该包含在pch中。嘿,我认为您可以尝试使用multiple/Yc,请参阅:。我认为您可以为内核lib的预编译头赋予不同的名称,然后包括multiple/Yc,以避免文档中指出的冲突。您将与C2859进行斗争,抱怨.pch和程序数据库之间不匹配。我认为你做不到。