stdafx.h文件
stdafx的英文全称为:Standard Application Framework Extensions(标准应用程序框架的扩展),stdafx.h并不是标准的C++系统头文件,也就是说,该文件本质上是Visual Studio自定义的头文件,由编译器生成,名称可以在属性管理器中自定义。
从内容上讲,stdafx.h文件主要存放以下两类语句——
- 标准系统包含文件,比如
iostream
string
algorithm
等这些; - 经常使用但是不常更改的项目特定文件。
如果项目比较大, 定义了大量数据结构,并include了第三方库,那么不妨把这些都放入stdafx.h文件中,这样,可以通过预编译头文件的方式加速编译过程。你需要在所有的独立文件中的第一行引入该文件——
#include"stdafc.h"// 使用了VS的预编译机制了之后,需要在每个文件的第一行加入该语句,否则会报错
使用了VS的预编译机制了之后,需要在每个文件的第一行加入该语句,否则会报错。同时,编译器还会生产对应的stdafx.cpp
文件,但该文件仅有#include"stdafx.h"
一行语句,作用是用于编译预编译头文件stdafx.h
中的内容。
Visual Studio预编译原理
所谓头文件预编译(precompiledheader,或称预编译头),就是把一个工程中常用的一些头文件预先编译,以后该工程编译时,不再编译这部分头文件,仅仅使用预编译结果,这样可以加快编译速度,节省时间。
Visual Studio提供了相关预编译头机制,在属性管理器中控制:
在创建项目的时候,用户选择预编译头文件模式,那么VS会自动生成stdafx.h
和stdafx.cpp
文件,如上文所述,stdafx.cpp
文件中仅包含’stdafx.h’,作用是编译该文件中的内容。在第一次编译项目时,将头文件stdafx.h
中所包含的所有头文件进行编译,从而生成一个预编译头文件project.pch
,在之后的编译中,只要stdafx.h
文件没有发生变化(时间戳没有变化),则编译器会跳过编译文件,直接使用该中间文件project.pch
,之后所有包含stdafx.h
文件的独立文件编译时都可以直接使用该中间文件,即一次编译,重复使用,从而提高效率。
实际上,这种做法是一种以空间换时间的做法,把不常改动的部分放入stdafx.h
中,只要stdafx.h
文件没有发生变化,那么编译的时候可以直接使用中间文件,而节省编译时间。但同时必然增加项目的存储空间占用。