如何有效地使用预编译头文件(使用/ Yc和Yu选项)?

aJ.*_*aJ. 8 c++ build precompiled-headers visual-studio

我们使用Visual Studio 2003(VC71)进行编译.为了减少编译时间,我们更改了构建脚本,以便为每个CPP文件生成预编译头文件(.pch).

makefile中使用的选项:

/Yc"StdAfx.h"
/Fp"StdAfx.pch"
Run Code Online (Sandbox Code Playgroud)

这样,目标的编译时间减少了30%.但是,任何人都可以帮助我理解即使每次编译每个CPP文件时生成pch文件,它如何减少编译时间.

还有,这是正确的方法吗?我们应该使用Yc和Yu组合吗?我不能使用/ Yu选项,因为pch文件应该至少生成一次.

pae*_*bal 22

问题

假设你有一个你知道不会改变的标题列表.例如,C头,或C++头,或Boost头等.

为每个CPP文件编译读取它们需要花费时间,这不是生产时间,因为编译器一次又一次地读取相同的标题,并且一次又一次地为这些相同的标题生成相同的编译结果.

应该有一些方法告诉编译器那些头文件总是一样的,并缓存他们的编译结果而不是一次又一次地重新编译它们,不是吗?

解决方案

预编译标题会考虑到这一点,因此您只需要:

  1. 将所有常见且不变的包含放在一个头文件中(例如,StdAfx.h)
  2. 有一个空的CPP文件(比如说StdAfx.cpp),只包含这一个头文件

现在,您需要告诉编译器StdAfx.cpp是包含公共和不变标头的空源.

这是使用flags/Yc和/ Yu的地方:

  • 使用/ Yc标志编译StdAfx.cpp文件
  • 使用/ Yu标志编译所有其他CPP文件

编译器将从StdAfx.cpp文件生成(在需要时)预编译的头文件,然后将此预编译的头文件重用于标记为/ Yu的所有其他文件.

注意

当您创建一个新项目时,旧版本的Visual C++(6和2003,如果我没记错的话)将默认激活预编译的头文件.最近的提供了激活它们的选择.

您应该创建一个新的VC++项目,并激活PCH以获得启用PCH的项目的工作版本,并研究编译选项.

有关PCH的更多信息,您可以访问以下URL: