关于预编译头

一、什么是预编译头? 预编译头物理上与通常的的.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的预编译头文件。       -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此时的命名规则参见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 起清除目标文件夹的作用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
预编译文件今天在改一个很大的程序,慢慢看,慢慢改。突然发现一个.c文件,里面什么也没有,就几个文件,我一看,我靠,这不是把简单的问题搞复杂了吗,随手删掉那个c文件。结果不能编译了,我靠:fatal error C1083: Cannot open precompiled header file: \'Debug/v13_3.pch\':No such file or directory怎么rebuild all都不行。上网查了一下,才搞懂了:----------------总结------如果工程很大,文件很多,而有几个文件又是经常要用的,那么1。把这些文件全部写到一个文件里面去,比如写到preh.h2。写一个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的功能,编译器在编译整个工程的时候,它只会编译那些经过修改的文件,而不会去编译那些从上次编译过,到现在没有被修改过的文件。那么为什么还要预编译文件呢?答案在这里,我们知道编译器是以文件为单位编译的,一个文件经过修改后,会重新编译整个文件,当然在这个文件里包含的所有文件中的东西(.eg Macro, Preprocesser )都要重新处理一遍。VC的预编译文件保存的正是这部分信息。以避免每次都要重新处理这些文件。预编译的作用:根据上文介绍,预编译文件的作用当然就是提高便宜速度了,有了它你没有必要每次都编译那些不需要经常改变的代码。编译性能当然就提高了。预编译的使用:要使用预编译,我们必须指定一个文件,这个文件包含我们不会经常改变的代码和其他的文件,然后我们用这个文件来生成一个预编译文件(.pch文件)想必大家都知道 StdAfx.h这个文件。很多人都认为这是VC提供的一个“系统级别”的,编译器带的一个文件。其实不是的,这个文件可以是任何名字的。我们来考察一个典型的由AppWizard生成的MFC Dialog Based 程序的预编译文件。(因为AppWizard会为我们指定好如何使用预编译文件,默认的是StdAfx.h,这是VC起的名字)。我们会发现这个文件里包含了以下的文件:#include // MFC core and standard components#include // MFC extensions#include // MFC Automation classes#include // MFC support for Internet Explorer 4Common Controls#include <br

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值