一、什么是预编译头?
预编译头物理上与通常的的.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
分享到:
相关推荐
<br>预编译头的使用: <br>要使用预编译头,我们必须指定一个头文件,这个头文件包含我们不会经常改变的 <br>代码和其他的头文件,然后我们用这个头文件来生成一个预编译头文件(.pch文件) <br>想必...
修复 VS2008出现"意外的预编译头错误,只需重新运行编译器就可能修复此问题”
所谓的预编译头就是把一个工程中的那一部分代码,预先编译好放在一个文件里(通常是以.pch为扩展名的),这个文件就称为预编译头文件,这些预先编译好的代码可以是任何的C/C++代码--------甚至是inline的函数,但是必须...
预编译头文件说明 C/C++头文件一览 预处理的由来 常见的预处理功能 预处理指令 文件包含指令
c编程中经常用到的各种常见的预编译命令。
简单的jdbcTemplate预编译、回调等
预编译详细资料,共90页。 掌握宏定义的使用方法; 掌握文件包含的使用方法; 了解条件编译的使用方法。 §7.1 概 述 C语言的编译系统分为编译预处理和正式编译,这是C 语言的一大特点,其中...
预编译命令大全; 讲述C语言各种预编译命令,详解,非常有用。
什么是预编译?对预编译的解释。对新手学习编程语言的一些基础帮助。
开始我有个特殊应用方式需要用到Mesa,但是找了很久都没找到新的能用的预编译dll。自己尝试了在本机Win10、虚拟机Ubuntu、云服务器Ubuntu、云服务器Server 2012 R2上编译,结果都是失败的。只在云服务器Ubuntu上编译...
JAVA预编译示例代码,包括1预编译中使用like 2javaSQL预编译异常 3预编译语句支持in方式 4在预编译中遇到的问题.有了这个文档,java预编译就不用再发愁了。
1、openssl3.0.0预编译二进制开发包SDK 2、Windows环境下基于Visual Studio2017编译 3、该资源是64位,无32位
预编译资料 经典预编译资料经典预编译资料经典预编译资料经典预编译资料
linux C++ 预编译 cmake样例
MySQL预编译功能
预编译处理虽然不难,但是学好C语言最好能弄懂预编译
自己编译的OSG3.0.0版本的预编译包,可以直接使用,缩短OSG的开发时间。
c语言预编译教程,比较详细,好不好看后便知,免费分享
几个预编译指令的用法
发布网站时,有的IIS服务器需要将网站预编译才能访问,该小工具可方便预编译,默认asp.net2.0