中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > Visual C++ > 综合文章
关于预编译头
作者:未知 时间:2003-05-19 12:12 出处:Blog 责编:chinaitpower
              摘要:关于预编译头

一、什么是预编译头?

预编译头物理上与通常的的.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 Ycprecomp.h ** 将建立precomp.pch的预编译头文件。

 

    -Yu 预编译的头文件的名字  表示在某个源文件时使用此预编译头,而不在进行重新编译。比如:

    cl c Yuprecomp.h **

    注:相应预编译头必须在前面已建立过。

 

四、在makefile中简单的使用预编译技术

 

obj\i386\debug.obj: debug.c debug.h

        $(CC) Ycprecomp.h -Fo$@ debug.c

        

obj\i386\OperateReg.obj: OperateReg.c OperateReg.h

        $(CC) Yuprecomp.h -Fo$@ OperateReg.c

       

obj\i386\WaterMark.obj: WaterMark.c WaterMark.h

        $(CC) Yuprecomp.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

 

 

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有