预编译:就是编译器首先编译某个文件,编译好后将结果保存在一个 以.pch为扩展名的文件里,这个pch文件就是预编译头文件。
预编译头的作用:提高编译速度,有了它就没必要每次都编译那些不需要经常改变的代码,编译性能当然就提高了。
生成预编译头文件(Precompiled header file):要生成预编译头文件,必须指定一个待编译的头文件,微软默认指定的是stdafx.h,这个文件的名字可 以改,内容也可以改。我们知道一个头文件是不能编译的,所以我们还需要一个cpp文件,这个文件默认是stdafx.cpp,该文件只有一句代码#include“stdafx.h”,然后compile(ctrl+F7)就可以出现一个(.pch)文件。
使用原则: 在每个 cpp文件的最开头,包含你指定生成 pch 文件的 .h 文件(默认是stdafx.h)。
注意:如果这些预先编译的代码被修改,则需要重新编译生成预编译头文件。注意生成预编译头文件是很耗时间的。同时你得注意预编译头文件通常很大,通常有6-7M大。注意及时清理那些没有用的预编译头文件。
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的预编译技术