C++预编译的定义Headers

Definition of C++ precompiled Headers

请帮助我有几个问题:什么是预编译的Headers?它们的用途是什么?如何制作一个?以及如何包含一个?

预编译headers(简称PCH)是一些编译器支持的东西。支持和它们包含的内容 [除了 "something that hopefully can be read quicker than the original header file"] 由每个编译器生产者决定。我对 Clang 是如何预编译的 headers 有一点了解,它基本上是 header 中 "parsed" C 或 C++ 代码的二进制形式 - 所以它产生一个不需要解析的文件 [与 header 文件本身的级别相同]。

目的是减少compile-time。但是,根据我的经验,编译的 LONG 部分通常 code-generation 进行了优化。但是,在某些情况下,尤其是涉及 header-files 个文件时,读取和解析 header 个文件的时间可能是整个编译时间的一个明显部分。

一般来说,它们的使用方式是告诉编译器你想要预编译header,对于每次编译,编译器都会生成预编译的header,如果它还没有的话,并在它出现时读入 [1] - 通常这是为一个名为 header 的文件完成的,其中包含许多其他内容。 Microsoft Visual Studio 通常有一个名为 "stdafx.h" 的预编译文件 - 至少在 MS 产品的情况下,这必须是项目中包含的第一个文件 [这是为了没有其他例如 header 文件改变了一些宏的含义——我希望有一个 compiler/command-line 宏定义的散列,所以如果其中一个改变,PCH 将被重新编译。

我们的想法是不在这个预编译文件中包含每个 header-file,而是在 MOST 文件中使用的 header 文件,并且不经常更改(PCH 需要如果预编译的文件已更改,则重新生成,因此如果您经常更改 header-files 则这样做没有意义)。当然,与任何其他构建依赖项一样,如果 PCH 已更改,任何使用预编译 header 的内容都需要重新构建。

要了解具体如何使用它,您需要阅读所用编译器的文档。

[1] 如果没有任何变化需要重建。