​ 在使用VS的过程中经常会见到stdafx.h这个头文件,初学者常常因为这个放弃了对VS的使用,又回到了垃圾的VC6.0的怀抱。

​ stdafx的英文全称为Standard Application Framework Extensions(标准应用程序框架的扩展)。stdafx.h这个头文件的作用是实现头文件预编译,就是把一个工程(解决方案)中要使用的一些MFC标准头文件(如Windows.h、Afxwin.h)预先编译,以后该工程文件编译时,不再编译这部分,可以加快编译速度。

解决方案结构

​ 上图是解决方案的结构,可以看到stdafx.h和stdafx.cpp这两个东西,其内容是

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// stdafx.h : 标准系统包含文件的包含文件,
// 或是经常使用但不常更改的
// 特定于项目的包含文件
//

#pragma once

#include "targetver.h"

#include <stdio.h>
#include <tchar.h>



// TODO: 在此处引用程序需要的其他头文件

1
2
3
4
5
6
7
8
9
// stdafx.cpp : 只包括标准包含文件的源文件
// Project1.pch 将作为预编译标头
// stdafx.obj 将包含预编译类型信息

#include "stdafx.h"

// TODO: 在 STDAFX.H 中引用任何所需的附加头文件,
//而不是在此文件中引用

​ 可以看到,在stdafx.h中,包含了stdio.h头文件,所以我可以使用printf这个函数:
示例代码

​ stdafx.h的作用就在于,如果解决方案中有多个Project1这样的项目,需要大量的编译一些经常使用但不常更改的头文件,那么,就可以将这些头文件包含在stdafx.h中,对头文件进行预编译,若再次使用它们的话,只要包含stdafx.h就行。如果看明白了这个逻辑,你应该就发现,stdafx.h本质上就是一个将你需要的头文件打包预编译的新的头文件。那么,这个新的头文件显然不是stdafx.h本身,里面就几句话。那这个新东西在那呢?

​ 我们先来看看如何预编译头文件。先指定一个头文件(.h),默认是stdafx.h,包含想要预编译的头文件,然后用stdafx.h来生成一个编译头文件(.pch,Precompiled Header),因为头文件是不能直接编译的,所以还需一个.cpp/.c文件作为桥梁,默认的就是stdafx.cpp。接下来就是用它来生成pch文件。在stdafx.h的属性设置中,你会看到相关设置。

属性

​ 第一栏,你可以选择创建还是使用,这里是创建,因为要生成pch文件给别的地方用,你看看project1.cpp的属性里,它就是使用,因为它包含了stdafx.h这个文件,它要用编译头文件。第二栏,指定预编译头文件,这意味着你可以创建多个预编译头文件,视需要在stdafx.cpp中包含它们。第三栏,指定生成pch文件的位置,这意味着你可以将pch拷贝复制给别人使用。设想,给客户使用预编译头文件时,如果要预编译的头文件很多,那也是很花时间的,如果直接把pch文件给别人,然后在属性里设置包含路径就可以直接用了。这里我遇到个问题,默认的pch文件名就是工程名.pch,但是一开时就是不生成,改成test.pch后才生成。

​ 注意:所有在#include “stdafx.h”这条指令前的代码都被看作预编译的。因此这句话必须放在第一行。

1
2
3
4
5
6
7
8
9
10
11
// Project1.cpp: 定义控制台应用程序的入口点。
//

#include "stdafx.h"


int main()
{
printf("hello");
return 0;
}

​ 其效果大约是:

1
2
3
4
5
6
7
8
9
10
11
12
// Project1.cpp: 定义控制台应用程序的入口点。
//

#include "test.pch"


int main()
{
printf("hello");
return 0;
}

​ 就是这么简单的东西,希望初学者不要一看到和书上,老师教的不一样就慌乱,不耐烦,多百度。