文档章节

visual c++ 中的stdafx.h头文件的作用

 流云的博客
发布于 2015/04/05 20:22
字数 1014
阅读 13870
收藏 6

stdafx.h

VC工程里面经常见到stdafx.h这个头文件,以前也没有特别注意,但是这个文件用不好经常会出错,所以就GOOGLE了一下,总算是弄清楚了。。。

stdafx的英文全称为:Standard Application Framework Extensions(标准应用程序框架的扩展)。

所谓头文件预编译,就是把一个工程(Project)中使用的一些MFC标准头文件(如Windows.H、Afxwin.H)预先编译,以后该工程编译时,不再编译这部分头文件,仅仅使用预编译的结果。这样可以加快编译速度,节省时间。

简介

预编译头文件通过编译stdafx.cpp生成,以工程名命名,由于预编译的头文件的后缀是“pch”,所以编译结果文件是projectname.pch。

编译器通过一个头文件stdafx.h来使用预编译头文件。stdafx.h这个头文件名是可以在project的编译设置里指定的。编译器认为,所有在指令#include "stdafx.h"前的代码都是预编译的,它跳过#include "stdafx. h"指令,使用projectname.pch编译这条指令之后的所有代码。

因此,所有的MFC实现文件第一条语句都是:#include "stdafx.h"。在它前面的所有代码将被忽略,所以其他的头文件应该在这一行后面被包含。否则,你将会得到“No such file or directory”这样让你百思不得其解的错误提示。

作用

stdafx.h中没有函数库,只是定义了一些环境参数,使得编译出来的程序能在32位的操作系统环境下运行。

Windows和MFC的include文件都非常大,即使有一个快速的处理程序,编译程序也要花费相当长的时间来完成工作。由于每个.CPP文件都包含相同的include文件,为每个.CPP文件都重复处理这些文件就显得很傻了。

为避免这种浪费,AppWizard和VisualC++编译程序一起进行工作,如下所示:

  ◎AppWizard建立了文件stdafx.h,该文件包含了所有当前工程文件需要的MFCinclude文件。且这一文件可以随被选择的选项而变化。

  ◎AppWizard然后就建立Stdafx.cpp。这个文件通常都是一样的。

  ◎然后AppWizard就建立起工程文件,这样第一个被编译的文件就是stdafx.cpp。

  ◎当VisualC++编译stdafx.cpp文件时,它将结果保存在一个名为stdafx.pch的文件里。(扩展名pch表示预编译头文件。)

  ◎当VisualC++编译随后的每个.cpp文件时,它阅读并使用它刚生成的.pch文件。VisualC++不再分析Windowsinclude文件,除非你又编辑了stdafx.cpp或stdafx.h。

在这个过程中你必须遵守以下规则:

  ◎你编写的任何.cpp文件都必须首先包含stdafx.h。

  ◎如果你有工程文件里的大多数.cpp文件需要.h文件,顺便将它们加在stdafx.h(后部)上,然后预编译stdafx.cpp。

  ◎由于.pch文件具有大量的符号信息,它是你的工程文件里最大的文件。

如果你的磁盘空间有限,你就希望能将这个你从没使用过的工程文件中的.pch文件删除。执行程序时并不需要它们,且随着工程文件的重新建立,它们也自动地重新建立。

原理

  通俗一点说当我们使用AppWizard来自动生成某些项目的时候,系统会自动把所需要include的头文件在stdafx.h中先include一下,这样,我们只需要直接include这个stdafx.h文件即可.因为同一个项目中的不同源文件CPP都包含相同的include文件,这样,为每个.CPP文件都重复include这些文件就显得很傻了。当然如果你不用MFC的话就不用了。即:在每个.cpp文件中都include stdafx.h 就相当于包含了其他的如iostream.h等文件

 


本文转载自:http://www.cnblogs.com/MuyouSome/p/3380033.html

粉丝 2
博文 40
码字总数 18974
作品 0
武汉
私信 提问
stdafx.h、stdafx.cpp两个文件的作用

stdafx.h、stdafx.cpp是干什么用的?为什么我的每一个cpp文件都必须包含stdafx.h? 这两个文件用于建立一个预编译的头文件.PCH和一个预定义的类型文件STDAFX.OBJ。 由于MFC体系结构非常大,包...

DDwang
2015/07/29
228
0
【Visual C++】关于无法打开包括文件:“StdAfx.h”或者意外结尾的错误解决方案

最近有朋友在编译我提供的【Visual C++】游戏开发某一节笔记的源代码的时候,提到出现 “fatal error C1083: 无法打开包括文件:“StdAfx.h”这个错误。这里我专门找了点资料,然后部分修改,...

长平狐
2012/11/12
406
0
使用 GNU CC 的预编译头文件加快编译速度

既使用过 Microsoft® Visual C++® 又使用过 GNU CC 的网友一定会感受到两者编译速度的差异,尤其是对于 wxWidgets 这样头文件内容多的软件。Microsoft® Visual C++® 能够有很高编译效率的...

AlphaJay
2010/11/23
672
0
关于预编译和宏定义部分说明

From: http://www.neu.edu.cn/cxsj/pointchart/c11/index.html #pragma指令 TAG:预编译和宏定义,ANSI C,# pragma TEXT: 其语法格式如下: # pragma token-sequence 此指令的作用是触发所定义的......

AlphaJay
2010/04/19
596
0
在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "StdAfx.h"”?

在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "StdAfx.h"”? 右键选择该文件.cpp格式的->属性->预编译头,→ 不使用预编译头 错误描述:fatal error C1010: 在查找预...

simpower
2018/07/12
35
0

没有更多内容

加载失败,请刷新页面

加载更多

Java 面试

https://www.bilibili.com/video/av51271222?from=search&seid=4920203212236751600 https://www.bilibili.com/video/av60309372/?spm_id_from=333.788.videocard.4......

MtrS
37分钟前
6
0
理想的数据分析平台

数据分析尤其是大数据分析这几年的热度依然不减,但面对眼花缭乱的数据分析产品很难去选择,那什么是理想的数据分析平台呢。下面是根据我的个人理解的理想数据分析平台,在次强调我理想的数据...

赛克蓝德
45分钟前
7
0
房贷计算器

题目要求 贷款有两种还款的方式:等额本金法和等额本息法,简单说明一下等额本息法与等额本金法的主要区别: 等额本息法的特点是:每月的还款额相同,在月供中“本金与利息”的分配比例中,前...

wzb88
56分钟前
10
0
springboot2 配置druid数据链接池,监控控制台

Druid是什么? Druid首先是Java语言中最好的数据库连接池,也是阿里巴巴的开源项目。Druid是阿里巴巴开发的号称为监控而生的数据库连接池,在功能、性能、扩展性方面,都超过其他数据库连接池...

万建宁
57分钟前
7
0
离线环境玩Docker-安装篇

如果你使用的是Mac之类的系统,推荐本地安装Docker,然后Docker运用运行CentOS(目标安装环境是CentOS)。如果你使用的是Windows,那么创建一个虚拟机可能是比较好的选择,Docker运行CentOS当然...

RippleChan
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部