终于搞懂了,预编译头文件
### 预编译头文件详解 #### 一、预编译头文件概念与作用 预编译头文件(Precompiled Headers, PCH)是一种优化技术,主要用于加速大型项目的编译过程。当项目中存在大量频繁使用的头文件时,通过预编译这些头文件可以显著提升编译速度。 **预编译头文件的概念:** - **定义**:预编译头文件是指将项目中一部分稳定的代码预先编译,并将编译结果存储在一个特定的文件中(通常以`.pch`为扩展名),以便后续编译过程中能够直接使用该编译结果。 - **适用场景**:适用于那些不会频繁修改的代码或头文件,如标准库或框架头文件等。 - **文件大小**:预编译头文件通常较大,可能达到几兆字节,因此需要注意及时清理不再使用的预编译头文件以节省磁盘空间。 **预编译头文件的作用:** - **提高编译效率**:通过预编译头文件,可以避免每次编译时都需要重新处理那些不变的头文件,从而大大加快编译速度。 #### 二、预编译头文件的工作原理 **编译器如何处理预编译头文件:** - **编译器的Time stamp机制**:即使编译器具有Time stamp功能,能够在编译时仅编译修改过的文件,但由于编译器是以文件为单位进行编译的,当一个文件发生修改时,其中包含的所有头文件仍需重新处理。预编译头文件则可以跳过这一过程。 - **预编译头文件保存的信息**:预编译头文件保存的是头文件中宏定义、预处理指令等信息的编译结果,使得在下次编译时可以直接使用这些信息,无需重复处理。 #### 三、预编译头文件的配置与使用 **预编译头文件的基本步骤:** 1. **创建预编译头文件**: - **编写包含稳定代码的头文件**:例如`preh.h`,该文件应包含所有不会频繁修改的头文件。 - **创建一个空的C源文件**:例如`preh.c`,该文件唯一的作用是包含上述`preh.h`文件。 2. **配置预编译头文件**: - 在项目设置中为`preh.c`文件配置`Creat precompiled headers`选项,指示编译器生成预编译头文件。 - 对于其他C源文件,配置`Use precompiled header file`选项,使其能够利用预编译头文件。 3. **生成预编译头文件**: - 编译`preh.c`文件,编译器将生成预编译头文件,如`Debug/v13_3.pch`。 4. **使用预编译头文件**: - 在其他C源文件的开头,使用`#include "preh.h"`来利用预编译头文件。 **注意事项:** - 必须确保每个C源文件在最开头包含了预编译头文件对应的头文件,否则会导致编译错误。 - 如果误删除了预编译头文件,可以通过重新编译相应的C源文件来重新生成。 #### 四、预编译头文件的具体案例 **MFC项目的预编译头文件设置:** - 默认情况下,MFC项目使用`StdAfx.h`作为预编译头文件,该文件包含了所有MFC的核心组件头文件。 - `StdAfx.cpp`文件负责生成预编译头文件,其内容仅为`#include "StdAfx.h"`。 - 在项目设置中,需要配置`StdAfx.cpp`的预编译头文件生成选项,以及其他C源文件的预编译头文件使用选项。 预编译头文件是提高大型项目编译效率的有效手段。正确配置并使用预编译头文件不仅可以减少编译时间,还能提高开发效率。然而,在实际应用中也需要注意维护预编译头文件的一致性和有效性,以避免出现不必要的问题。
今天在改一个很大的程序,慢慢看,慢慢改。突然发现一个.c文件,里面什么也没有,
就几个头文件,我一看,我靠,这不是把简单的问题搞复杂了吗,随手删掉那个c文件。
结果不能编译了,我靠:
fatal error C1083: Cannot open precompiled header file: \'Debug/v13_3.pch\':
No such file or directory
怎么rebuild all都不行。
上网查了一下,才搞懂了:
----------------总结------
如果工程很大,头文件很多,而有几个头文件又是经常要用的,那么
1。把这些头文件全部写到一个头文件里面去,比如写到preh.h
2。写一个preh.c,里面只一句话:#include "preh.h"
3。对于preh.c,在project setting里面设置creat precompiled headers,对于其他
.c文件,设置use precompiled header file
//
我试了一下,效果很明显,不用precompiled header,编译一次我可以去上个厕所,用
precompiled header,编译的时候,我可以站起来伸个懒腰,活动活动就差不多啦
---------转载的文章----------
预编译头的概念:
所谓的预编译头就是把一个工程中的那一部分代码,预先编译好放在一个文件里(通常是
以.pch为扩展名的),这个文件就称为预编译头文件这些预先编译好的代码可以是任何的
C/C++代码--------甚至是inline的函数,但是必须是稳定的,在工程开发的过程中不会
被经常改变。如果这些代码被修改,则需要重新编译生成预编译头文件。注意生成预编
译头文件是很耗时间的。同时你得注意预编译头文件通常很大,通常有6-7M大。注意及
时清理那些没有用的预编译头文件。
也许你会问:现在的编译器都有Time stamp的功能,编译器在编译整个工程的时候,它
只会编译那些经过修改的文件,而不会去编译那些从上次编译过,到现在没有被修改过
的文件。那么为什么还要预编译头文件呢?答案在这里,我们知道编译器是以文件为单
位编译的,一个文件经过修改后,会重新编译整个文件,当然在这个文件里包含的所有
剩余5页未读,继续阅读
- youzaicz2014-02-07自己的程序老是出现找不到pch文件,总算明白咋回事了
- 感激赐教2015-04-08内容还不错,下载的资源居然就是更多简介中的内容,我也是醉了
- 普通网友2012-11-06讲的很详细,很好,总算懂了这个了。
- 粉丝: 0
- 资源: 2
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- (源码)基于OVMS v3的无线控制台系统(WifiConsole).zip
- (源码)基于Arduino和ESP32的IoT计算机开关系统.zip
- (源码)基于Qt框架的PX4飞行控制器固件升级系统.zip
- (源码)基于Spring Boot和Vue的需求管理系统.zip
- 基于深度学习YOLOv5的车牌检测与识别项目源码
- (源码)基于Python的CSGO饰品价格分析与比较系统.zip
- ccs3.3安装补丁SR12-CCS-v3.3-SR-3.3.82.13 2
- (源码)基于Spring Boot框架的攀枝花物流系统.zip
- (源码)基于Spring Boot和Vue的权限管理系统.zip
- (源码)基于Python和HMM的酵母起始密码子预测系统.zip