预编译头文件

一. 概念

预编译:就是编译器首先编译某个文件,编译好后将结果保存在一个 以.pch为扩展名的文件里,这个pch文件就是预编译头文件

预编译头的作用提高编译速度有了它就没必要每次都编译那些不需要经常改变的代码,编译性能当然就提高了。

生成预编译头文件(Precompiled header file):要生成预编译头文件,必须指定一个待编译的头文件,微软默认指定的是stdafx.h,这个文件的名字可  以改,内容也可以改。我们知道一个头文件是不能编译的,所以我们还需要一个cpp文件,这个文件默认是stdafx.cpp,该文件只有一句代码#include“stdafx.h”,然后compile(ctrl+F7)就可以出现一个(.pch)文件。

使用原则: 在每个 cpp文件的最开头,包含你指定生成 pch 文件的 .h 文件(默认是stdafx.h)。

注意:如果这些预先编译的代码被修改,则需要重新编译生成预编译头文件。注意生成预编译头文件是很耗时间的。同时你得注意预编译头文件通常很大,通常有6-7M大。注意及时清理那些没有用的预编译头文件

二. VS2008中的预编译头文件

      如果根据向导建立一个带预编译头文件的Win32控制台程序,Solution explorer中可以看到有stdafx.h和stdafx.cpp,这两个文件就是用来生成预编译头文件的,也是微软默认的。
     此时compile,会发现是不能成功的,错误是 fatal error C1083: Cannot open precompiled header file: 'Debug\×××.pch': No such file or directory,意思就是没有.pch文件。如上面所说,其实编译的过程是利用预先编译好的预编译头文件来减少编译的工作量,那么既然没有这个预编译头文件,那怎么编译呢?我们可以在Solution explorer,右击工程,单击property,在右边的框中选择Configuration Properties->C/C++->Preprocessor,看到在右边的Create/Use Precompoled Header中默认的是Use Precompiled Header(/Yu),也就是说现在还没有建立.pch呢,就开始用了,显然不适合,那就改喽,单击之,选择Create Precompoled Header(/Yc),就可以了。编译,可以看到在Debug文件夹中多了个.pch,也就是说这个预编译头文件搞定了。
        再回到Create/Use Precompoled Header那页中,看到Create/Use Precompoled Header下面,Create/Use PCH Through File中是Stdafx.h,这里还是上面说的,一会编译器就默认用这个制作预编译头文件,制作完成的头文件放哪里呢,下面一个项是Precompoled Header File就是指示生成的.pch的地址的,其默认的地址是$(IntDir)\$(TargetName).pch(这里的$表示当前工程文件夹,$(IntDir)表示当前文件夹的Debug文件夹,下拉点edit可以看到类似IntDir\Outir之类的地址目录),生成在Debug目录下,名称是(工程名).pch。
      再有就是既然已经Create了个预编译头文件,那么以后就不要总是Create了,我们就要把Create/Use Precompoled Header中的改回Use Precompiled Header(/Yu),然后就可以节约编译时间了。

三. Q&A

   Q: 什么情况下使用预编译头文件?

   A:(1) 一些大型程序用这个比较好,但是一些小型的不点行的程序还是不要用预编译头文件的好,因为Create一个预编译头文件本身也是要时间的。(2) 预编译头文件中一般只放系统头文件。(3) 自己编的一些很常用的基本固定不变的头文件。      

   Q:现在的编译器都有Time stamp的功能,编译器在编译整个工程的时候,它只会编译那些经过修改的文件,而不会去编译那些从上次编译过,到现在没有被修改过的文件。那么为什么还要预编译头文件呢?

   A:我们知道编译器是以文件为单位编译的,一个文件经过修改后,会重新编译整个文件,当然在这个文件里包含的所有头文件中的东西(.eg   Macro, Preprocesser )都要重新处理一遍。VC的预编译头文件保存的正是这部分信息。以避免每次都要重新处理这些头文件。 

  Q:加stdafx.h和stdafx.cpp总觉得是和编译平台绑定了,不具备移植性?

  A:其实,注意一下stdafx.h的写法就没有问题了。我的解决方案是(stdafx.h的内容):

–begin of file stdafx.h

#ifdef _WIN32

#include “win.h”    // 泛指window下的公共头文件

#else

#include “linux.h”    // 泛指linux下的公共头文件

#endif

#include “crt.h”      //泛指c标准库

#include “stl.h”      //泛指STL库

–end of file

或者更加简单一点,如果不是VC编译器,那么stdafx.h就什么内容都不写!

Ref:

 1.   预编译头文件的作用

 2.   关于预编译头文件

 3.   如何使用VC的预编译技术




你可能感兴趣的:(VC)