stdafx是一种APP应用,应用非常简单。
stdafx.h没有包装器,但定义了一些环境参数,以便编译的程序可以在32位操作系统环境中运行。
名称标准APP标注框架扩展
外语名称standardapplicationframeworkextensions
全名stdafx
stdafx.h标准系统包含文件中的包含文件
生成条件编译stdafx.cpp生成
目录
1定义
2工作原理
3作用
4文件问题
定义
所谓头文件的预编译是指事先编译在一个项目(Project )中使用的几个MFC标准头文件(例如Windows.H、Afxwin.H ),之后编译该项目这样可以加快编译速度,节约时间。
afx曾是微软的专业技术开发团队,stdafx.h是该团队为了定义某些环境构成、参数设定等而专门定义的。
工作原理
Windows和MFC包含文件非常大,即使有快速的处理程序,编译器也需要相当长的时间才能完成工作。 每个. CPP文件都包含相同的include文件,因此为每个. CPP文件重复处理这些文件是愚蠢的。
为了避免这种浪费,AppWizard和VisualC编译器的工作方式如下:
AppWizard创建了一个文件stdafx.h,其中包含当前工程文件所需的所有MFC包含文件。 您可以根据选择的选项更改此文件。
AppWizard然后创建stdafx.cpp。 这个文件通常是一样的。
然后,AppWizard创建工程文档。 以这种方式编译的第一个文档是stdafx.cpp。
当VisualC编译stdafx.cpp文件时,结果将保存在名为stdafx.pch的文件中。 (扩展名pch意味着头文件的预编译。 )
VisualC在编译后续的. cpp文件时读取并使用刚生成的. pch文件。 除非编辑stdafx.cpp或stdafx.h,否则VisualC不再分析Windowsinclude文件。
STDafx.h-STDafx.CPP-CPP的编译结果位于stdafx.pch中-.PCH的编译
在这个过程中你必须遵守以下规则。
你创建的. cpp文件必须首先包含stdafx.h。
如果工程文件中的大多数. cpp文件都包含所需的. h文件,请立即将其添加到stdafx.h (后部),并预编译stdafx.cpp。
.PCH文件具有大量的符号信息,因此它是你的工程文件中最大的文件。
如果磁盘空间有限,我们希望从未使用的项目文件中删除. pch文件。 在进程运行时不需要,在重新创建工程文档时会自动重新创建。
作用
stdafx.h的作用
使用AppWizard自动生成特定项目时,系统会自动将所需的include头文件include到stdafx.h中。 这样的话,直接include STD afx.h文件就可以了。 因为同一项目中的不同源文件CPP包含相同的include文件
具体来说,stdafx.h需要include的什么样的头文件取决于用户在AppWizard上的选择。
例如:
# includeafxwin.h//mfccoreandstandardcomponents
# include afxext.h//MFC extensions
# includeafxole.h//mfcoleclasses
# includeafxodlgs.h//mfcoledialogclasses
# includeafxdisp.h//mfcautomationclasses
……
读了这样的描述,我马上进行了实验,自己创建了一个新的windows窗口项目,并很快生成了stdafx.cpp和stdafx.h。
然后,在主要源文件form1.cpp中,关于名为include的头文件stdafx.h。
只有在使用AppWizard自动生成项目时,才会发生以上情况。 否则,就不需要include此头文件stdafx.h
stdafx.h :标准系统包含文件包含文件。
Microsoft C和c编译器提供了预编译任何c或c代码(包括内联代码)的选项。 利用此性能特性,可以编译稳定的代码主体,将处于已编译状态的代码保存到文件中,然后将预编译的代码与后续编译中的代码进行组合
来。由于不需要重新编译稳定代码,因此后面每次编译的速度都要快一些。
预编译代码有助于在开发周期中缩短编译时间,特别是在以下情况中:
一:总是使用不经常改动的大型代码体。
二:程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。在这种情况下,可以将所有包含文件预编译为一个预编译头。
三: 用于创建预编译头文件的第一次编译所花费的时间比后面的编译稍长一些。通过包含预编译代码可以加快后面的编译速度。C 和 C++ 程序都可以预编译。在 C++ 编程中,常见的做法是将类接口信息分别放到不同的头文件中。此后就可以将这些头文件包含在使用该类的程序中。通过预编译这些头文件,可以缩短程序的编译时间。
VC创建项目时自动创建的预编译头文件,在编译其他文件之前,VC先预编译此文件。头文件stdafx.h引入了项目中需要的一些通用的头文件,比如window.h等,在自己的头文件中包括stdafx.h就包含了那些通用的头文件。
预编译头文件通过编译stdafx.cpp生成,以工程名命名,由于预编译的头文件的后缀是“pch”,所以编译结果文件是projectname.pch。
编译器通过一个头文件stdafx.h来使用预编译头文件。stdafx.h这个头文件名是可以在project的编译设置里指定的。编译器认为,所有在指令#include “stdafx.h”前的代码都是预编译的,它跳过#include “stdafx. h”指令,使用projectname.pch编译这条指令之后的所有代码。
因此,所有VC实现的CPP文件第一条语句都是:#include “stdafx.h”。
文件的问题
我们都知道,他是 预编译头文件,就是说,我们在 stdafx.cpp里include一次,生成一次pch,pdb文件, 其他地方实际上直接用这个编译的结果,从而减少编译时间,提高编译效率。一般,我们把常用的不变的库头文件放里面,如,atlbase.h,atlcore.h,windows.h等,通常的com里import进来的 dll,tlb也放这个里面,这样,它能做到,只编译一次,其他地方直接用编译出的结果。
以上是如果stdafx被正确使用时,它确实大大提高我们编程的效率(你工作中,有多少时间是在等编译完成?很多吧,这个时候一般都很无聊,无奈,浪费时间),但是他太容易用错了。
如果在其他的.h文件里也include “stdafx.h”.则会产生问题:你的project里用了别人写的.h文件,导致你的编译速度奇慢无比,而且你做任何小的修改,编译都要好久好久,等的心烦,预编译根本没发挥作用。这个就可能给你h文件的人用错预编译文件了。由于你用到的.h文件里include了stdafx,他在他本身的project里,vs能够判断的出他是预编译头,也能找的到需要的pch,pdb文件。所以对写这个.h文件的人没影响。但是你作为他的客户,你工作在你的project下,你include了他的h头文件,而这时vs判断不出他的头文件里include的stdafx是预编译头文件,做普通文件编。那可想而知,他的stdafx里如果有import外面大型的库(如inventor的tlb,非常慢,我们犯了这个错),那编译速度简直是煎熬。最要命的是,以后你做任何简单的修改,这个stdafx都要重编,这和预编译解决的问题恰好相反了。所以,绝对不要在h头文件里(特别是发布给外面人用的h头文件)里include你的stdafx.h!
stdafx.h里面包含什么
包含VC++目录下的引用的.h文件。每个文件夹内的.h不能重名。
.h文件是用来声明函数的原型的。函数的实现最好写在cpp里。
引用类的静态函数要用::不用.
转载于:https://www.cnblogs.com/lightmare/p/10398857.html