一、什么是预编译头?
预编译头物理上与通常的的.obj文件是一样的,但编译入预编译头的.h,.c,.cpp文件在整个编译过程中,只编译一次,如预编译头所涉及的部分不发生改变的话,在随后的编译过程中此部分不重新进行编译。进而大大提高编译速度,并便于对头文件进行管理,也有助于杜绝重复包含问题。
二、什么时候使用预编译头?
当大多.c或.cpp文件都需要相同的头文件时。
当某些代码被大量重复使用时。
当导入某些不同库都有实现的函数,并产生混乱时。
三、预编译头所涉及的编译开关及使用方法(for msvc)
1、自动预编译:由编译器决定什么时候建立和使用预编译头。
编译参数:-YX。使用此参数缺省时建立以VCxy.pch命名的预编译头文件。其中x,y是vc的版本号。可以用-Fp指定pch文件的输出路径和文件名。
比如:cl –c –YX –Fp“precomp.pch” **将在当前目录下生成precomp.pch的预编译头文件。**代表源文件。
2、手动预编译:
编译参数:
-Yc”预编译的头文件的名字” 此时缺省建立与头文件同名的预编译头文件。如要该为其他名字,可使用-Fp选项。
比如:cl –c –Yc”precomp.h” ** 将建立precomp.pch的预编译头文件。
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
-Yu” 预编译的头文件的名字” 表示在某个源文件时使用此预编译头,而不在进行重新编译。比如:
cl –c –Yu”precomp.h” **
注:相应预编译头必须在前面已建立过。
四、在makefile中简单的使用预编译技术
obj/i386/debug.obj: debug.c debug.h
$(CC) –Yc”precomp.h” -Fo$@ debug.c
obj/i386/OperateReg.obj: OperateReg.c OperateReg.h
$(CC) –Yu”precomp.h” -Fo$@ OperateReg.c
obj/i386/WaterMark.obj: WaterMark.c WaterMark.h
$(CC) –Yu”precomp.h” -Fo$@ WaterMark.c
以下同。
其中precomp.h为想预编译的头文件。
五、关于预编译头的一些复杂的使用方法
如:
cl -c -Yc"stuff.h" -Fplevel1.pch level1.cpp -------------(1)
cl -c -Yu"stuff.h" -Fplevel1.pch -Yc level2.cpp --------------(2)
level2.cpp的开始是这样的,其中 #pragma hdrstop 表示预编译结束,所以说代码也可以放入预编译头。
#include "stuff.h"
#include "morestuff.h"
#pragma hdrstop("level2.pch")
(1) 建立使用stuff.h 重命名为level1.pch的预编译头。
(2) 在从stuff.h建立的预编译头level1.pch的基础上,参考level2.cpp建立另一个预编译头level2.pch
此时的命名规则参见Yc无参数时的使用方法。
预编译头的其他使用细则请参考msdn。
附:
1、 预编译与guard宏
这是两个根本没有关系的概念,如果说非要找出相同的地方,那就是预编译头对控制重复包含也有一定的帮助。
#ifndef _PLOTBRUSH_
#define _PLOTBRUSH_
---
#endif // _PLOTBRUSH_
这种guard宏是防止在同一个.c文件中把同一个.h文件包含两次。
即防止出现
#include <windows.h>
#include <windows.h>
的情况的。
而预编译头相当于在全局的角度,来控制那些部分仅被编译一次的问题。
而guard宏只对当前编译单元有效。在1.c中定义了_PLOTBRUSH_对2.c是根本没影响的。
2、 98ddk中build 时,使用build –Z将只编译有改变的源文件。-c 起清除目标文件夹的作用。
如有错漏请指正。
Written by 李智勇
2003/3/21
分享到:
相关推荐
在使用Visual Studio 2008 (VS2008) 进行软件开发时,开发者可能会遇到一个棘手的问题,即"fatal error C1853: 预编译头错误"。这个错误通常表示编译器在处理预编译头文件时遇到了不一致或意外的情况,导致编译过程...
预编译头(Precompiled Header,PCH)是C++编程中提高编译效率的一种技术。它的核心思想是将项目中频繁使用且不常改动的头文件预先编译成一个二进制文件,通常以.pch为扩展名,以便在后续的编译过程中快速加载这些...
### 预编译头文件详解 #### 一、预编译头文件概念与作用 预编译头文件(Precompiled Headers, PCH)是一种优化技术,主要用于加速大型项目的编译过程。当项目中存在大量频繁使用的头文件时,通过预编译这些头文件...
预编译头文件说明 C/C++头文件一览 预处理的由来 常见的预处理功能 预处理指令 文件包含指令
C++预编译命令详解 预编译命令是C语言和C++语言中非常重要的一部分,它们可以在编译前对代码进行处理和修改,从而影响编译器的行为。本文将详细介绍各种C++预编译命令,包括#pragma指令的多种用法。 #pragma指令 ...
预编译指令和预编译头文件 预编译是编译器在正式编译之前对源代码进行的预处理阶段,在这个阶段,编译器会对源代码进行分析和处理,以便生成可执行文件。在这个阶段,编译器会处理以 "#" 开头的预编译指令,如 #...
本篇文章将详细讲解`jdbcTemplate`的预编译使用,以及如何通过回调方法进行定制化的数据处理。 首先,`jdbcTemplate`的核心功能是通过预编译的SQL语句(PreparedStatement)来执行数据库操作。预编译SQL可以有效...
在C++编程中,预编译头(Precompiled Headers,简称PCH)是一个重要的优化技巧,它可以显著提高大型项目的编译速度。预编译头文件通常包含常用的、不经常改变的头文件,如标准库头文件,使得这些内容只需要编译一次...
在Linux环境下进行C++开发时,预编译是提高构建效率和管理复杂项目的重要环节。预编译主要包括头文件预处理、预编译宏定义以及模块化预编译等概念。预编译过程有助于减少重复编译的工作量,特别是在大型项目中,可以...
JavaScript预编译是一种优化代码执行效率的技术,尤其在大型项目中尤为重要。预编译的主要目的是在实际运行前处理代码,减少解析和运行时的负担,提高应用的性能。本篇文章将深入探讨JavaScript预编译的概念、重要性...
**OpenSSL 3.0.0 预编译二进制开发包详解** OpenSSL 是一个开源项目,提供了一套强大的加密库,包括各种安全协议、加密算法以及证书管理等,广泛应用于网络安全、服务器安全等领域。OpenSSL 3.0.0 是其最新版本,...
MySQL 预编译功能 MySQL 预编译功能是指在执行 SQL 语句之前,对 SQL 语句进行编译和优化,以提高执行效率。在 MySQL 中,预编译功能可以通过使用 Prepare 语句来实现。 预编译功能的优点是可以减少 SQL 语句的...
Java 和 C 语言在编程范式上有显著差异,C 语言支持预编译指令,如 `#define`、`#ifdef`、`#endif` 等,这些指令在源代码编译之前进行处理,可以实现条件编译、宏定义等功能。然而,Java 本身并不直接支持这样的预...
**OpenSceneGraph (OSG) 预编译包详解** OpenSceneGraph(简称OSG)是一个开源的高性能3D图形库,专为实时可视化应用设计。它基于OpenGL API,提供了一套完整的工具集,包括场景图管理、图形渲染、动画、图像处理等...
网站的预编译是一个重要的开发流程,特别是在大型项目或者高性能网站的构建中,它能够显著提升网站的加载速度和运行效率。预编译是将动态语言(如PHP、Ruby on Rails、ASP.NET等)的代码在部署之前转换为静态HTML、...
【IIS网站预编译工具】是一个用于提升ASP.NET网站性能和优化服务器资源管理的实用程序,源码的提供使得用户可以根据自身需求进行定制。在ASP.NET框架中,预编译是一个重要的步骤,尤其在大型或者高流量的网站中,它...
《C语言预编译详解》 C语言的预编译机制是其独特之处,它将编译过程分为预处理和正式编译两个阶段。预处理阶段主要负责处理以符号“#”开头的预处理指令,这些指令不涉及语法和语义的检查,而是对源代码进行初步...
本示例主要关注如何在WebLogic环境中进行JSP的预编译,这有助于提升应用程序的启动速度和性能。预编译过程将JSP文件转换为Servlet源码,然后编译成.class文件,减少了运行时的解析和编译时间。 一、JSP预编译的重要...
### 预编译概述与应用 #### 一、预编译的概念 预编译是编程语言中的一个重要概念,尤其在C语言中占有极其重要的地位。预编译是指在源代码正式编译之前进行的一系列处理操作。这些操作主要包括宏定义、文件包含以及...