1. stdafx.h头文件是干什么用的呢?
预编译是为了提高编译速度!
- 编译入预编译头的.h,.c,.cpp文件在整个编译过程中,只编译一次,如预编译头所涉及的部分不发生改变的话,在随后的编译过程中此部分不重新进行编译。进而大大提高编译速度,且便于对头文件进行管理,也有助于杜绝重复包含问题。
- 在MFC项目中,一般都会包含stdafx.h和stdafx.cpp文件,MFC项目要使用的头文件比如windows.h等都比较大,如果每个.cpp文件都要包含这些头文件的话,编译的时候速度就会很慢.
- 所以微软采取了这样一个策略。在stdafx.h中默认包含了这些头文件,在编译之前会采用预编译的方法。也就是先把这些头文件所包含的信息编译成二进制文件储存起来,储存的文件后缀名为.pch。所以这个文件通常比较大,因为包含的信息较多。
- 有stdafx.h头文件,还会有一个stdafx.cpp文件,这样编译器在遇到这个文件时,就会先进行预编译处理。这样其他cpp文件只需要包含stdafx.h头文件就可以使用MFC的头文件了。
2. 什么时候使用预编译头?
- 当大多数.c或.cpp文件都需要相同的头文件时。
- 当某些代码被大量重复使用时。
- 当导入某些不同库都有实现的函数,并产生混乱时。
3. 为什么每个.cpp文件都需要在最上面包含stdafx.h这个文件呢?
编译器在编译的时候,在遇到
#include "stdafx.h"
这句之前都认为是预编译的,所以就不会再进行编译了。所以如果把一些
include
信息写在这句之前就可能产生一些找不到头文件中的生命的错误。
4. stdafx.h,stdafx.cpp文件如何创建?
(1) 用VS新建项目,选择【Win32】-【Win32控制台应用程序】- 输入名称:Test -【确定】
再选【下一步】- 一般,我们都是在【空项目】前打上对勾,建立一个纯的C或C++程序。
这里选择默认,即【预编译头】前打上对勾,之后【完成】
(2) 在Test项目中,头文件有stdafx.h和targetver.h,源文件有stdafx.cpp和Test.cpp,还有一个ReadMe.txt文件。
(3)
默认的主函数为:
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
return 0;
}
而我们一般写的程序是下面的形式:
#include <stdio.h>
int main()
{
return 0;
}
我们要纠结,这里怎么没有stdio.h了呢,取而代之的是stdafx.h?
打开stdafx.h文件,这里包含了stdio.h库文件,如下:
// stdafx.h : 标准系统包含文件的包含文件,
// 或是经常使用但不常更改的
// 特定于项目的包含文件
//
#pragma once
#include "targetver.h"
#include <stdio.h>
#include <tchar.h>
// TODO: 在此处引用程序需要的其他头文件
stdafx.cpp文件:里面只有包含的库文件,没有操作。
// stdafx.cpp : 只包括标准包含文件的源文件
// Test.pch 将作为预编译头
// stdafx.obj 将包含预编译类型信息
#include "stdafx.h"
// TODO: 在 STDAFX.H 中
// 引用任何所需的附加头文件,而不是在此文件中引用