问题
假设您有一个您知道不会更改的标题列表。例如,C 头文件,或 C++ 头文件,或 Boost 头文件等。
为每个 CPP 文件编译读取它们需要时间,这不是生产时间,因为编译器一次又一次地读取相同的头文件,并一次又一次地为这些相同的头文件生成相同的编译结果。
应该有某种方法告诉编译器这些头文件总是相同的,并缓存它们的编译结果而不是一次又一次地重新编译它们,不是吗?
解决方案
预编译的头文件考虑到了这一点,所以你只需要:
- 将所有常见且不变的包含放在一个头文件中(例如,StdAfx.h)
- 有一个空的 CPP 文件(例如,StdAfx.cpp),只包含这个头文件
现在,您需要告诉编译器 StdAfx.cpp 是包含通用和不变标头的空源。
这是使用标志 /Yc 和 /Yu 的地方:
- 使用 /Yc 标志编译 StdAfx.cpp 文件
- 使用 /Yu 标志编译所有其他 CPP 文件
并且编译器会(在需要时)从 StdAfx.cpp 文件生成一个预编译的头文件,然后将这个预编译的头文件重用于所有其他标有 /Yu 的文件。
笔记
当你创建一个新项目时,旧版本的 Visual C++(6 和 2003,如果我没记错的话)会默认激活预编译的头文件。最近的提供了激活它们的选择。
您应该创建一个激活 PCH 的新 VC++ 项目,以获得支持 PCH 的项目的工作版本,并研究编译选项。
有关 PCH 的更多信息,您可以访问以下 URL: