新闻  |   论坛  |   博客  |   在线研讨会
关于程序中的一些预编译头的咚咚
tongxin | 2009-04-12 15:04:44    阅读:802   发布文章

一、什么是预编译头?
%A
%A 预编译头物理上与通常的的.obj文件是一样的,但编译入预编译头的.h,.c,.cpp文件在整个编译过程中,只编译一次,如预编译头所涉及的部分不发生改变的话,在随后的编译过程中此部分不重新进行编译。进而大大提高编译速度,并便于对头文件进行管理,也有助于杜绝重复包含问题。
%A
%A 二、什么时候使用预编译头?
%A
%A 当大多.c或.cpp文件都需要相同的头文件时。
%A
%A 当某些代码被大量重复使用时。
%A
%A 当导入某些不同库都有实现的函数,并产生混乱时。
%A
%A 三、预编译头所涉及的编译开关及使用方法(for msvc)
%A
%A 1、自动预编译:由编译器决定什么时候建立和使用预编译头。
%A
%A 编译参数:-YX。使用此参数缺省时建立以VCxy.pch命名的预编译头文件。其中x,y是vc的版本号。可以用-Fp指定pch文件的输出路径和文件名。
%A
%A 比如:cl ?Cc ?CYX ?CFp“precomp.pch” **将在当前目录下生成precomp.pch的预编译头文件。**代表源文件。
%A
%A 2、手动预编译:
%A
%A     编译参数:
%A
%A -Yc”预编译的头文件的名字” 此时缺省建立与头文件同名的预编译头文件。如要该为其他名字,可使用-Fp选项。
%A
%A     比如:cl ?Cc ?CYc”precomp.h” ** 将建立precomp.pch的预编译头文件。
%A
%A
%A
%A     -Yu” 预编译的头文件的名字”  表示在某个源文件时使用此预编译头,而不在进行重新编译。比如:
%A
%A     cl ?Cc ?CYu”precomp.h” **
%A
%A     注:相应预编译头必须在前面已建立过。
%A
%A
%A
%A 四、在makefile中简单的使用预编译技术
%A
%A
%A
%A obji386debug.obj: debug.c debug.h
%A
%A         $(CC) ?CYc”precomp.h” -Fo$@ debug.c
%A
%A         
%A
%A obji386OperateReg.obj: OperateReg.c OperateReg.h
%A
%A         $(CC) ?CYu”precomp.h” -Fo$@ OperateReg.c
%A
%A         
%A
%A obji386WaterMark.obj: WaterMark.c WaterMark.h
%A
%A         $(CC) ?CYu”precomp.h” -Fo$@ WaterMark.c  
%A
%A 以下同。
%A
%A 其中precomp.h为想预编译的头文件。
%A
%A
%A
%A 五、关于预编译头的一些复杂的使用方法
%A
%A 如:
%A
%A cl -c -Yc"stuff.h" -Fplevel1.pch level1.cpp       -------------(1)
%A cl -c -Yu"stuff.h" -Fplevel1.pch -Yc level2.cpp   --------------(2)
%A level2.cpp的开始是这样的,其中 #pragma hdrstop 表示预编译结束,所以说代码也可以放入预编译头。
%A #include "stuff.h"
%A #include "morestuff.h"
%A #pragma hdrstop("level2.pch")
%A
%A (1)       建立使用stuff.h 重命名为level1.pch的预编译头。
%A (2)       在从stuff.h建立的预编译头level1.pch的基础上,参考level2.cpp建立另一个预编译头level2.pch
%A 此时的命名规则参见Yc无参数时的使用方法。
%A
%A 预编译头的其他使用细则请参考msdn。
%A
%A 附:
%A 1、  预编译与guard宏
%A 这是两个根本没有关系的概念,如果说非要找出相同的地方,那就是预编译头对控制重复包含也有一定的帮助。
%A #ifndef _PLOTBRUSH_
%A #define _PLOTBRUSH_
%A ---
%A #endif  // _PLOTBRUSH_
%A 这种guard宏是防止在同一个.c文件中把同一个.h文件包含两次。
%A 即防止出现
%A #include <windows.h>
%A #include <windows.h>
%A 的情况的。
%A 而预编译头相当于在全局的角度,来控制那些部分仅被编译一次的问题。
%A 而guard宏只对当前编译单元有效。在1.c中定义了_PLOTBRUSH_对2.c是根本没影响的。
%A
%A 2、  98ddk中build 时,使用build ?CZ将只编译有改变的源文件。-c 起清除目标文件夹的作用。
%A
%A%A
%A

*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
最近文章
寂寞如雪
2009-05-19 19:01:18
夜色花
2009-05-19 18:56:22
没有爱可以重来
2009-05-19 18:54:59
推荐文章
最近访客