打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
【stdafx.h】 afx.h

stdafx.h : 标准系统包含文件的包含文件。

  Microsoft C 和 C++ 编译器提供了用于预编译任何 C 或 C++ 代码(包括内联代码)的选项。利用此性能特性,可以编译稳定的代码体,将已编译状态的代码存储在文件中,以及在随后的编译中,将预编译的代码与仍在开发的代码结合起来。由于不需要重新编译稳定代码,因此后面每次编译的速度都要快一些。

  预编译代码有助于在开发周期中缩短编译时间,特别是在以下情况中:

  <UL><LI>总是使用不经常改动的大型代码体。

  <LI>程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。在这种情况下,可以将所有包含文件预编译为一个预编译头。

  </LI></UL> 用于创建预编译头文件的第一次编译所花费的时间比后面的编译稍长一些。通过包含预编译代码可以加快后面的编译速度。C 和 C++ 程序都可以预编译。在 C++ 编程中,常见的做法是将类接口信息分别放到不同的头文件中。此后就可以将这些头文件包含在使用该类的程序中。通过预编译这些头文件,可以缩短程序的编译时间。

  VC创建项目时自动创建的预编译头文件,在编译其他文件之前,VC先预编译此文件。头文件stdafx.h引入了项目中需要的一些通用的头文件,比如window.h等,在自己的头文件中包括stdafx.h就包含了那些通用的头文件。</CA>

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

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

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

  因此,所有的CPP实现文件第一条语句都是:#include "stdafx.h"。
 
 

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

Windows和MFC的include文件都非常大,即使有一个快速的处理程序,编译程序也要花费相当长的时间来完成工作。由于每个.CPP文件都包含相同的include文件,为每个.CPP文件都重复处理这些文件就显得很傻了。
为避免这种浪费,AppWizard和VisualC++编译程序一起进行工作,如下所示:
◎AppWizard建立了文件stdafx.h,该文件包含了所有当前工程文件需要的MFCinclude文件。且这一文件可以随被选择的选项而变化。//不大明白,是自动建立的吗?console不需要把
◎AppWizard然后就建立stdafx.cpp。这个文件通常都是一样的。
◎然后AppWizard就建立起工程文件,这样第一个被编译的文件就是stdafx.cpp
◎当VisualC++编译stdafx.cpp文件时,它将结果保存在一个名为stdafx.pch的文件里。(扩展名pch表示预编译头文件。)
◎当VisualC++编译随后的每个.cpp文件时,它阅读并使用它刚生成的.pch文件。VisualC++不再分析Windowsinclude文件,除非你又编缉了stdafx.cpp或stdafx.h。
这个技术很精巧,你不这么认为吗?(还要说一句,Microsoft并非是首先采用这种技术的公司,Borland才是。)在这个过程中你必须遵守以下规则:
你编写的任何.cpp文件都必须首先包含stdafx.h。
◎如果你有工程文件里的大多数.cpp文件需要.h文件,顺便将它们加在stdafx.h(后部)上,然后预编译stdafx.cpp。
◎由于.pch文件具有大量的符号信息,它是你的工程文件里最大的文件。
如果你的磁盘空间有限,你就希望能将这个你从没使用过的工程文件中的.pch文件删除。执行程序时并不需要它们,且随着工程文件的重新建立,它们也自动地重新建立.

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

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

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

因此,所有的CPP实现文件第一条语句都是:#include "stdafx.h"。//条件是?

Afx前缀是微软MFC一个小组的名称简写,并没有别的意义。
MFC的很多代码,包括全局函数名、宏、头文件名都使用了"Afx"。
Afx*.h是一组MFC的核心头文件,比如:
afxwin.h 定义MFC的核心和标准组件
afxext.h 定义MFC的扩展
afxdisp.h 是MFC自动化支持的类定义头文件
afxdb.h 是MFC的ODBC类封装
 
AFX.H
2008-11-01 18:05

分两种情况:
1。创建工程的时候,你选择MFC Application在你的程序中就可以直接用。
2。如果你创建的是Win32 Application工程,如果想使用MFC的某个类可以如下方式来操作:
a)首先选择菜单里的 Project->Settings。打开的属性对话框里右侧点General选项卡(默认打开的就是这个)有个Microsoft Foundation Classes的选项。此时选择的是Not Using MFC,更改其为Use MFC in a shared DLL。
b)接下来查MSDN看想要使用的类包含在哪个头文件里,如我想使用MFC的CString类,经查询,需要包含Afx.h头文件。将其包含到工程中就可以使用了
注意一点:非常重要,Afx.h的位置写在哪里呢?如果它出现在#include <Windows.h>之后,编译就会报错。
所以,打开StdAfx.h文件,就能找到Windows.h的位置了。加在其之前!
#include <Afx.h>
#include <windows.h>
编译...通过!
祝好运!

====================================================================

3月22日

某个奇怪的链接问题--error 2005,nafxcwd.lib,LIBCMTD.lib,already defined

出现过好几次了
以前的解决方法是将工程文件删除,只保存源文件,重建工程,可以编译链接通过,但再次打开工程时,又会出错,今天很有心情(^ ^),google了一下,网上也有类似的问题
仔细分析了一下,发现问题可能出在对工程中各个cpp文件的编译选项不一致上,由于某些原因,有一部分cpp文件使用预编译头选项(Precompiled Header),有一部分没有使用,造成链接时加载库上的冲突
从网上一个角落里发现一条链接
http://support.microsoft.com/default.aspx?scid=kb;en-us;q148652
在ms搜索里,中文结果
http://support.microsoft.com/kb/148652/zh-cn
对照着看,理解确实是由于运行库加载的问题
"CRT 库对 new、delete 和 DllMain 函数使用弱外部链接.MFC 库也包含 new、delete 和 DllMain 函数.这些函数要求先链接 MFC 库,然后再链接 CRT 库."
解决方法在上头有说明,我觉得应该先找到出现问题的模块,即加载库的顺序,以及链接错误提示的冲突的模块,然后用强制链接器按照正确的顺序链接
第二种是我自己试出来的,即保证每个cpp文件都用预编译头选项(afx.h或stdafx.h,包含这两个文件,没有的话新建,一般的mfc工程都会自动生成,保证包含就可以了),上头的说法是afx.h或stdafx.h中用#pragma comment (lib,"<libname>") 来保证了库的强制加载顺序
OK,搞定

=====================================================

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
VC中stdafx.h中afx代表什么意思
#include "stdafx.h" 作用
visual C++头文件stdafx.h
[摘录]在非MFC程序中引用CString
(转载)VC编译器命令行详解
预编译和预编译头的概念以及使用
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服