C++预编译头的定义

C++预编译头的定义,c++,header,precompiled,C++,Header,Precompiled,请帮忙,我有几个问题:什么是预编译头?它们的用途是什么?怎么做?如何包含一个?一些编译器支持预编译头PCH。支持和它们包含的内容[除了希望能够比原始头文件读得更快的内容之外]由每个编译器生产者决定。我有点了解Clang是如何做它的预编译头的,它基本上是头中解析的C或C++代码的二进制形式,所以它产生了一个不需要解析的文件(与头文件本身相同的级别)。p> 目的是减少编译时间。然而,根据我的经验,编译的长部分通常是优化代码生成。但是,在某些情况下,特别是当涉及大量头文件时,读取和解析头文件的时间可能

请帮忙,我有几个问题:什么是预编译头?它们的用途是什么?怎么做?如何包含一个?

一些编译器支持预编译头PCH。支持和它们包含的内容[除了希望能够比原始头文件读得更快的内容之外]由每个编译器生产者决定。我有点了解Clang是如何做它的预编译头的,它基本上是头中解析的C或C++代码的二进制形式,所以它产生了一个不需要解析的文件(与头文件本身相同的级别)。p> 目的是减少编译时间。然而,根据我的经验,编译的长部分通常是优化代码生成。但是,在某些情况下,特别是当涉及大量头文件时,读取和解析头文件的时间可能是整个编译时间中值得注意的一部分

一般来说,它们的使用方式是告诉编译器您需要预编译头,对于每次编译,编译器将生成预编译头(如果它不在那里),并在它存在时读入[1]-通常这是针对一个命名头文件完成的,其中包括许多其他内容。Microsoft Visual Studio通常有一个名为stdafx.h的文件,该文件是预编译的,至少在MS产品中,它必须是项目中包含的第一个文件[这是因为没有其他头文件(例如)会更改某些宏的含义-我希望宏的编译器/命令行定义会出现散列,因此如果其中一个发生更改,则会重新编译PCH]

其思想不是将每个头文件都包含在这个预编译文件中,而是包含在大多数文件中使用的头文件,并且这些头文件不会经常更改。如果预编译的文件已更改,则需要重新生成PCH,因此,如果您一直频繁更改头文件,那么这样做没有意义。当然,与其他头文件一样其他构建依赖项,如果PCH已更改,则需要重新生成使用预编译头的任何内容

要了解如何使用它,您需要阅读正在使用的编译器的文档


[1]如果没有任何更改,则需要重新编译。

以前从未听说过“预编译库”这个词。你可能在考虑吗?@IgorTandetnik是的,我想有多少个头?头经常更改吗?顺便说一句,预编译头是编译器的一个特长,不是标准语言的一部分。你在使用什么编译器?如果有的话对于频繁更改的头文件,预编译头文件不会产生任何好处。我建议不要使用预编译头文件,除非1所有头文件不经常更改;2您的生成过程需要数小时才能完成。