关于预编译头

原创 2003年05月22日 08:31:00

一、什么是预编译头?

预编译头物理上与通常的的.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的预编译头文件。

 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

    -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

 

 

vs在项目中去掉预编译头,去掉自动生成的stdafx.h等文件

以VS2012为例。 项目建好后去掉预编译头: 新建项目时按默认方式已经选择了预编译,在后期要如何取消或关闭预编译呢? 项目---->属性---->配置属性---->C/C++---->预编...
  • u013470115
  • u013470115
  • 2014年12月22日 18:54
  • 5320

带你玩转Visual Studio——带你理解微软的预编译头技术

所谓头文件预编译技术,就是把一个工程(Project)中常用的一些头文件(如标准头文件Windows.h、Afxwin.h等,也可以是自己定义的头文件)包含在stdafx.h中,并对stdafx.h预...
  • luoweifu
  • luoweifu
  • 2015年10月10日 22:31
  • 11485

正确使用vs的预编译头

预编译头的概念: 所谓的预编译头就是把一个工程中的那一部分代码,预先编译好放在一个文件里(通常是 以.pch为扩展名的),这个文件就称为预编译头文件这些预先编译好的代码可以是任何的 ...
  • ly416
  • ly416
  • 2014年04月29日 19:18
  • 4916

正确使用预编译头

预编译头文件的问题整了一晚上,终于明白了预编译头文件.DXUT(The DirectX Utility Library)是初学DirectX的一个好用的框架, 今天照着Sample里的EmptyPro...
  • gouki04
  • gouki04
  • 2011年03月03日 09:41
  • 4424

VS2013取消预编译头

创建C++ Win32控制台时忘了取消预编译头,怎么取消? 右键项目->属性->配置属性->C/C++->预编译头->不使用预编译头。 改天再写预编译头是干嘛的...
  • zinnc
  • zinnc
  • 2016年02月28日 10:43
  • 5366

warning C4603: “_WINDLL”: 未定义宏或在预编译头使用后定义发生改变

wxdebug.cpp(11) : warning C4603: “_WINDLL”: 未定义宏或在预编译头使用后定义发生改变    Posted on 2011-07-13 00:40 皓...
  • yangqinjiang
  • yangqinjiang
  • 2013年05月23日 22:04
  • 3132

C++中预编译头/yc /yu的区别

创建了一个空的工程,不停的添加新项,添加新类,数量越来越多,发现,每次修改一处,都会把所有的重新编译,速度实在太慢,原来是没有使用预编译头。 我把别的工程的stdafx.h和stdafx.cpp拷过...
  • softmanfly
  • softmanfly
  • 2014年12月03日 23:33
  • 1126

VC++编译器预编译头功能(stdafx.h)原理与实践

VC++预编译头功能的原理与实践。
  • smstong
  • smstong
  • 2014年12月30日 15:04
  • 3673

VS在查找预编译头使用时跳过解决

visual studio默认没有找到#include "StdAfx.h" 在查找预编译头使用时跳过,如果文件和StdAfx.h不在一个目录下(比如#include "../StdAfx.h")会导...
  • brk1985
  • brk1985
  • 2015年04月07日 16:06
  • 2337

ZZ Cmake 设置预编译头

项目采用cmake管理代码,涉及预编译头修改,在某某网下载了一个,写的不错,验证过VC工程设置有效:...
  • qugang1982
  • qugang1982
  • 2013年11月28日 21:57
  • 1720
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于预编译头
举报原因:
原因补充:

(最多只允许输入30个字)