stdafx.h预编译头

合集下载

c++中的stadfx.h代表什么

c++中的stadfx.h代表什么

Standard Application Frame Extend没有函数库,只是定义了一些环境参数,使得编译出来的程序能在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++不再分析Windows include文件,除非你又编缉了stdafx.cpp或stdafx.h。

这个技术很精巧,你不这么认为吗?(还要说一句,Microsoft并非是首先采用这种技术的公司,Borland才是。

)在这个过程中你必须遵守以下规则:◎你编写的任何.cpp文件都必须首先包含stdafx.h。

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

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

如果你的磁盘空间有限,你就希望能将这个你从没使用过的工程文件中的.pch文件删除。

执行程序时并不需要它们,且随着工程文件的重新建立,它们也自动地重新建立。

VS2010 C++错误处理办法

VS2010 C++错误处理办法

VS2010 C++错误处理办法(转载)vs2010中文旗舰版怎么出现创建新项目失败???你可以试试:开始-> 所有程序-> 附件-> 命令提示符(右键点击一管理员身份运行)。

打开后,再输入Regsvr32 JScript.dll。

错误:1 fatal error C1010: unexpected endof file while looking for precompiled header. Did you forget to add '#include"StdAfx.h"' to your source?#include"StdAfx.h" 你把这个放在头文件里面就行了2 vc++编程出现错误error C2447: missing function header (old-styleformal list?)原因:函数后面多了分号;SUNSHINE_APISSN_RETURN SsnWriteProfileString(__in INT nPlugInId, __in_opt LPTSTRlpszGroupName, __in LPTSTR lpszKey, __in LPTSTR lpszValue);3 errorC2491: 'SsnWriteProfileString' : definition of dllimport function not allowed错误C2491:―SsnWriteProfileString‘:dllimport函数的定义不允许的SUNSHINE_API SSN_RETURNSsnWriteProfileString(__in INT nPlugInId, __in_opt LPTSTR lpszGroupName, __inLPTSTR lpszKey, __in LPTSTR lpszValue)查看SUNSHINE_API在 .h文件中的定义#ifdefSSNAPI_EXPORTS#define SUNSHINE_API __declspec(dllexport)#else#define SUNSHINE_API __declspec(dllimport)#endif将#ifdef SSNAPI_EXPORTS添加到#include<stdafx.h>的下面;形如:#include<stdafx.h>#defineSSNAPI_EXPORTS则解决;4 error C2065: “CString”:未声明的标识符在非mfc下使用CString 会导致上面错误:解决办法:(1)如果你使用那么:使用MFC:包含cstringt.h;不使用MFC:包含atlstr.h(2)或者#include <afx.h>5 error C2065: 'DEBUG_NEW' : undeclared identifier?删除 .cpp 文件中的#ifdef _DEBUG#undef THIS_FILEstatic char THIS_FILE[]=__FILE__;#define new DEBUG_NEW#endif6 问题:error C2440: 'initializing' : cannot convert from 'constchar [34]' to 'TCHAR [128]'错误C2440:“初始化”:不能把'字符常量[34]' ' TCHAR[128]'原因:编译选项有没有开了UNICODE;做法:在vs2010下设置unicode编译选项,去掉unicode模式,具体设置方法为:项目-》属性-》配置属性-》字符集-》未设置project->Properties->ConfigurationProperties->General->Character Set->Not Set /hrh2010/article/details/66812717问题:C1083:Cannot open include file: 'stdafx.h': No such file or directoryC1083:无法打开包括文件:―stdafx.h中‖:没有这样的文件或目录解决:stdafx.h文件和工程的.h文件放在一个位置;8 error C2065: “cout”: 未声明的标识符解决方法:加上#include <iostream>using namespace std;9 错误:error C3872: '0x3000': thischaracter is not allowed in an identifier错误C3872:'0 X3000“:此字符不允许在标识符0x3000是汉语的空格,也就是全角空格,相当于一个汉字,但你又看不见它。

Stdio.h与stdafx.h的区别

Stdio.h与stdafx.h的区别

Stdio.h与stdafx.h的区别
stdio.h是C/C++中标准的头文件,这个文件是系统头文件,由编译器厂商提供。

stdafx.h是vc生成工程时生成的用户头文件,属于工程的一部分,stdafx.h是vc工程的预编译头文件。

用于包含工程中每个文件都要包含的文件。

用于加快编译速度和整理代码结构
比如工程由四个cpp文件组成
a.cpp
b.cpp
c.cpp
d.cpp
每个cpp文件都要包含
stdio.h
stdlib.h
windows.h
那么可以把
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
放到stdafx.h中
而每个cpp只需要
#include "stdafx.h"即可
这样在便于维护代码,配合上编译器的预编译功能,还可以加快编译速度
如果不喜欢vc自动生成stdafx.h,在生成工程时选中empty project 即可。

MFC各类库详解

MFC各类库详解

1.MFC概述1.MFC是一个编程框架MFC (Microsoft Foundation Class Library)中的各种类结合起来构成了一个应用程序框架,它的目的就是让程序员在此基础上来建立Windows下的应用程序,这是一种相对SDK来说更为简单的方法。

因为总体上,MFC框架定义了应用程序的轮廓,并提供了用户接口的标准实现方法,程序员所要做的就是通过预定义的接口把具体应用程序特有的东西填入这个轮廓。

Microsoft Visual C++提供了相应的工具来完成这个工作:AppWizard可以用来生成初步的框架文件(代码和资源等);资源编辑器用于帮助直观地设计用户接口;ClassWizard用来协助添加代码到框架文件;最后,编译,则通过类库实现了应用程序特定的逻辑。

1.封装构成MFC框架的是MFC类库。

MFC类库是C++类库。

这些类或者封装了Win32应用程序编程接口,或者封装了应用程序的概念,或者封装了OLE特性,或者封装了ODBC和DAO数据访问的功能,等等,分述如下。

(1)对Win32应用程序编程接口的封装用一个C++ Object来包装一个Windows Object。

例如:class CWnd是一个C++ window object,它把Windows window(HWND)和Windows window有关的API函数封装在C++ window object的成员函数内,后者的成员变量m_hWnd就是前者的窗口句柄。

(2)对应用程序概念的封装使用SDK编写Windows应用程序时,总要定义窗口过程,登记Windows Class,创建窗口,等等。

MFC把许多类似的处理封装起来,替程序员完成这些工作。

另外,MFC提出了以文档-视图为中心的编程模式,MFC类库封装了对它的支持。

文档是用户操作的数据对象,视图是数据操作的窗口,用户通过它处理、查看数据。

(3)对COM/OLE特性的封装OLE建立在COM模型之上,由于支持OLE的应用程序必须实现一系列的接口(Interface),因而相当繁琐。

关于编译错误 fatal error C1083 Cannot open precompiled header file

关于编译错误 fatal error C1083 Cannot open precompiled header file
今天编译一个比较大的工程时,总是遇到这样的编译错误,想必凡是用过VC6.0做过比较大的程序 或者做过MFC开发的朋友都遇到过。错误提示如下,fatal error C1083:Cannot open precompiled header file: 'rcmq.pch': Permission denied .其中rcmq是我的工程的名字。
我到网上查了资料,顺便学习据我的项目开发经验,我总结了避免这个编译错误的一些方法:
(1)在菜单栏里的工程 -> 设置 -> C/C++ 中,预编译的的头文件选项卡,选择“不使用预补偿页眉”单选项就可以了。不过这种方法的缺点是以后每次编译都会比较慢。
(2)由于在大的工程里,有一些头文件经常使用,往往就会导致这样的编译错误。解决办法是把这些经常使用的头文件写入一个文件(比如 precompile.h)里,就如MFC程序里的stdAfx.h一样,然后在文件precompile.cpp文件里加入#include <precompile.h>即可。对于precompile.cpp在项目设置里选择“设置补偿页眉文件”,对于其他.cpp文件设置“使 用补偿页眉文件”。
下面是在网上看到的有关预编译头文件的机制,还是很有必要研究一下的。
预编译头的概念: 所谓的预编译头就是把一个工程中的那一部分代码,预先编译好放在一个文件里(通常是以.pch为扩展名的),这个文件就称为预编译头文件这些预先编译好的 代码可以是任何的C/C++代码--------甚至是inline的函数,但是必须是稳定的,在工程开发的过程中不会被经常改变。如果这些代码被修改, 则需要重新编译生成预编译头文件。注意生成预编译头文件是很耗时间的。同时你得注意预编译头文件通常很大,通常有6-7M大。注意及时清理那些没有用的预 编译头文件。 也许你会问:现在的编译器都有Time stamp的功能,编译器在编译整个工程的时候,它只会编译那些经过修改的文件,而不会去编译那些从上次编译过,到现在没有被修改过的文件。那么为什么还 要预编译头文件呢?答案在这里,我们知道编译器是以文件为单位编译的,一个文件经过修改后,会重新编译整个文件,当然在这个文件里包含的所有头文件中的东 西(.eg Macro, Preprocesser )都要重新处理一遍。VC的预编译头文件保存的正是这部分信息。以避免每次都要重新处理这些头文件。 预编译头的作用: 根据上文介绍,预编译头文件的作用当然就是提高便宜速度了,有了它你没有必要每次都编译那些不需要经常改变的代码。编译性能当然就提高了。 预编译头的使用: 要使用预编译头,我们必须指定一个头文件,这个头文件包含我们不会经常改变的代码和其他的头文件,然后我们用这个头文件来生成一个预编译头文件(.pch 文件)想必大家都知道 StdAfx.h这个文件。很多人都认为这是VC提供的一个“系统级别”的,编译器带的一个头文件。其实不是的,这个文件可以是任何名字的。我们来考察一 个典型的由AppWizard生成的MFC Dialog Based 程序的预编译头文件。(因为AppWizard会为我们指定好如何使用预编译头文件,默认的是StdAfx.h,这是VC起的名字)。我们会 发现这个头文件里包含了以下的头文件: #include <afxwin.h> // MFC core and standard components #include <afxext.h> // MFC extensions #include <afxdisp.h> // MFC Automation classes #include <afxdtctl.h> // MFC support for Internet Explorer 4Common Controls #include <afxcmn.h> 这些正是使用MFC的必须包含的头文件,当然我们不太可能在我们的工程中修改 这些头文件的,所以说他们是稳定的。 那么我们如何指定它来生成预编译头文件。我们知道一个头文件是不能编译的。所 以我们还需要一个cpp文件来生成.pch 文件。这个文件默认的就是StdAfx.cpp。在这个文件里只有一句代码就是:#include “Stdafx.h”。原因是理所当然的,我们仅仅是要它能够编译而已?D?D?D也就是说,要的只是它的.cpp的扩展名。我们可以用/Yc编译开关来 指定StdAfx.cpp来生成一个.pch文件,通过/Fp编译开关来指定生成的pch文件的名字。打开 project->Setting->C/C++ 对话框。把Category指向Precompiled Header。在左边的树形视图里选择整个工程 Project Options(右下角的那个白的地方)可以看到 /Fp “debug/PCH.pch”,这就是指定生成的.pch文件的名字,默认的通常是 <工程名>.pch(我的示例工程名就是PCH)。 然后,在左边的树形视图里选择StdAfx.cpp.//这时只能选一个 cpp文件!这时原来的Project Option变成了 Source File Option(原来是工程,现在是一个文件,当然变了)。在这里我们可以看到 /Yc开关,/Yc的作用就是指定这个文件来创建一个Pch文件。/Yc后面的文件名是那个包含了稳定代码的头文件,一个工程里只能有一个文件的可以有 YC开关。VC就根据这个选项把 StdAfx.cpp编译成一个Obj文件和一个PCH文件。 然后我们再选择一个其它的文件来看看,//其他cpp文件在这 里,Precomplier 选择了 Use ⋯⋯⋯一项,头文件是我们指定创建PCH 文件的stdafx.h文件。事实上,这里是使用工程里的设置,(如图1)/Yu”stdafx.h”。 这样,我们就设置好了预编译头文件。也就是说,我们可以使用预编译头功能了。以下是注意事项:1):如果使用了/Yu,就是说使用了预编译,我们在每个.cpp文件的最开头,我强调一遍是最开头,包含 你指定产生pch文件的.h文件(默认是stdafx.h)不然就会有问题。如果你没有包含这个文件,就告诉你Unexpected file end. 如果你不是在最开头包含的,你自己试以下就知道了,绝对有很惊人的效果⋯..fatal error C1010: unexpected end of file while looking for precompiledheader directiveGenerating Code...2)如果你把pch文件不小心丢了,编译的时候就会产生很多的不正常的行为。根据以上的分析,你只要让编译器生成一个pch文件。也就是说把 stdafx.cpp(即指定/Yc的那个cpp文件)从新编译一遍。当然你可以傻傻的 Rebuild All。简单一点就是选择那个cpp文件,按一下Ctrl + F7就可以了。不然可是很浪费时间的哦。

在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#includestdafx.h。。。

在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#includestdafx.h。。。
你new的数据还是jvm的堆内存里没有执行write操作你的数据不会写入到os的文件系统里
在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添 加 “#includestdafx.h。。。
S中出现是否忘记了向源中添加“#include “stdafx.h””?的错误解决办法 经常在用VS来写项目时,会出现这一问题。 在经过相关资料的查阅之后,发现是预编译有些问题。
解决办法: 对于每一个我们添加的cpp项中,都点击右键选择属性,然后在预编译头中选择: 不使用预编译头
对于每一个文件都执行这样的操作,就可以解决这一问题了。

关于VC编译错误fatalerrorC1083的解决办法(共12页)

关于VC编译错误fatalerrorC1083的解决办法(共12页)

关于VC编译(biānyì)错误fatal error C1083的解决办法这时因为该模块没有包括(bāokuò)预编译头文件“stdafx.h”的缘故(yuáng ù)。

VC用一个stdafx.cpp包含头文件stdafx.h,然后在stdafx.h里包含大部分系统头文件,这样编译时VC就通过编译stdafx.cpp把大部分系统头文件预编译进来了,在Debug目录下有一个很大的文件*.pch,这里就存储了预编译信息。

根据这个原理,如果这个pch损坏了或被删除了,系统重新编译时就会抱怨“cannot openprecompiled header file debug/*.pch”。

这时怎么解决这个问题呢,打开Project-》Setting对话框选C++页,将Category下拉式列表框选中Precompiled Headers,最简单的办法就是选中第一个选项“Not using....",这样就根本不用预编译头也不去寻找pch文件,就不会出错了,但是这样做的后果是每次编译、连接都化更多的时间。

第二个选项”Automatic ...",然后在“Through header”力填上stdafx.h,这样如果没有pch文件系统会自动生成一个pch,如果有的话就使用这个pch,这个选项是比较“智能”的。

第三个选项是强行创建一个pch文件,第四个选项是直接使用pch文件。

当然“Throughheaders”里都填stdafx.h了。

1.nafxcwd.lib(appcore.obj) : error LNK2001: unresolved external symbol ___argvnafxcwd.lib(appcore.obj) : error LNK2001: unresolved external symbol ___argcnafxcwd.lib(timecore.obj) : error LNK2001: unresolved external symbol __mbctypenafxcwd.lib(apphelp.obj) : error LNK2001: unresolved external symbol __mbctypenafxcwd.lib(filelist.obj) : error LNK2001: unresolved external symbol __mbctype解决办法:PROJECT->SETING->C/C++->PREPROCESSOR->定义 _AFXDLL,完毕。

c++预编译命令

c++预编译命令

在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。

#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征。

依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的。

其格式一般为: #Pragma Para其中Para 为参数,下面来看一些常用的参数。

(1)message 参数。

Message 参数是我最喜欢的一个参数,它能够在编译信息输出窗口中输出相应的信息,这对于源代码信息的控制是非常重要的。

其使用方法为:#Pragma message(“消息文本”)当编译器遇到这条指令时就在编译输出窗口中将消息文本打印出来。

当我们在程序中定义了许多宏来控制源代码版本的时候,我们自己有可能都会忘记有没有正确的设置这些宏,此时我们可以用这条指令在编译的时候就进行检查。

假设我们希望判断自己有没有在源代码的什么地方定义了_X86这个宏可以用下面的方法#ifdef _X86#Pragma message(“_X86 macro activated!”)#endif当我们定义了_X86这个宏以后,应用程序在编译时就会在编译输出窗口里显示“_ X86 macro activated!”。

我们就不会因为不记得自己定义的一些特定的宏而抓耳挠腮了。

(2)另一个使用得比较多的pragma参数是code_seg。

格式如:#pragma code_seg( ["section-name"[,"section-class"] ] )它能够设置程序中函数代码存放的代码段,当我们开发驱动程序的时候就会使用到它。

(3)#pragma once (比较常用)只要在头文件的最开始加入这条指令就能够保证头文件被编译一次,这条指令实际上在VC6中就已经有了,但是考虑到兼容性并没有太多的使用它。

MFC编译运行错误之无法打开预编译头文件

MFC编译运行错误之无法打开预编译头文件

MFC编译运行错误之无法打开预编译头文件1。

用编辑程序,按Ctrl+F7,出现下列错误:fatal error C1083: 无法打开预编译头文件:“Debug/UGFace.pch”: No such file or directory解决方法:修改:项目->属性->C/C++ ->预编译头->不使用预编译头即可。

2。

学用Visual C++ 6.0的第一个例程就让我出了错.用向导生成第一个基于对话框的Project 之后,当我按照书上的源程序一个字一个字地输进去之后,始终有一个错误:fatal error C1010: unexpected end of file while looking for precompiled header directive.找了无数次之后,我决定把向导生成的包括头文件的语句:include"StdAfx.h"保留(而这之前我是把它删掉了的,因为书上的例子没有这句.)咦,这下就对了.这是为什么呢?我百思不得其解。

来到我的VC源代码目录,我注意到每个Project下面的DEBUG文件夹都特别大,而且一个扩展名为.pch的文件占去了绝大部分,我删掉之好像对程序编译运行没有什么影响。

于是抱着对.pch文件的好奇,我在网上搜到了我疑惑之处的解答。

这就是VC++6.0给我们带来的:预编译头文件。

预编译头文件(一般扩展名为.PCH),是把一个工程中较稳定的代码预先编译好放在一个文件(.PCH)里。

这些预先编译好的代码可以是任何的C/C++代码,甚至可以是inline函数,只是它们在整个工程中是较为稳定的,即在工程开发过程中不会经常被修改的代码。

为什么需要预编译头文件?一言以蔽之:提高编译速度.一般地,编译器以文件为单位编译。

如果修改了一工程中的一个文件则所有文件都要重新编译,包括头文件里的所有东西(eg.Macro宏,Preprocessor预处理),而VC程序中,这些头文件中所包括的东西往往是非常大的,编译之将占很长的时间。

C++常见错误和解决方法

C++常见错误和解决方法
1错误: fatal error C1010: unexpected endof file while looking for precompiled header. Did you forget toadd '#include"StdAfx.h"' to your source?
#include"StdAfx.h" 你把这个放在头文件里面就行了 2 vc++编程出现错误error C2447: missing function header (old-styleformal list?) 原因:函数后面多了分号; SUNSHINE_APISSN_RETURN SsnWriteProfileString(__in INT nPlugInId, __in_opt LPTSTRlpszGroupName, __in LPTSTR lpszKey, __in LPTSTR lpszValue);
project->Properties->ConfigurationProperties->General->Character Set->Not Set /hrh2010/article/details/6681271
7问题: C1083:Cannot open include file: 'stdafx.h': No such file or directory C1083:无法打开包括文件:“stdafx.h中”:没有这样的文件或目录 解决:stdafx.h文件和工程的.h文件放在一个位置; 8 error C2065: “cout”: 未声明的标识符 解决方法:加上 #include <iostream> using namespace std; 9 错误: error C3872: '0x3000': thischaracter is not allowed in an identifier 错误C3872:'0 X3000“:此字符不允许在标识符 0x3000是汉语的空格,也就是全角空格,相当于一个汉字,但你又看不见它。

C++编码规范

C++编码规范

C++编码规范严谨编码风格的重要性:1.便于代码合并,满⾜团队开发的需要2.合格程序员的必备素质3.防⽌编码错误4.易读易理解Google C++编码规范(中⽂版)1.头⽂件尽可能多的使⽤前向声明好处:较少的⽂件依赖,减少编译时间. 更加明确的类的依赖关系.1//.h中类B使⽤类A,使⽤前向声明就不需要包含类A的头⽂件,减少编译⼯作量2class CA; //前向声明⼀个类A3class CB4 {5public:6 CA* m_pA;//声明类A的指针7 CA* GetClassA(CA *pA, CA &a); //声明使⽤类A作为形参或返回值类型的函数8//CA m_A; Error,不能定义类A的对象9 };2.函数的参数顺序,输⼊参数在前,输出参数在后输⼊参数⼀般为传值或者指针,引⽤,前⾯加const输出参数⼀般为⾮常量指针或者引⽤好处:根据参数的位置明确参数的作⽤,⼀⽬了然1//输⼊参数: nInput cInput szInput2//输出参数: nOutPut3void Fun(const int nInput, const char cInput, const char* pStrInput, int &nOutPut);3.头⽂件的包含顺序stdafx.h预编译头⽂件先包含当前源⽂件对应的头⽂件C系统头⽂件C++系统头⽂件其它库头⽂件本项⽬其它头⽂件每个区域之间空⼀⾏好处:增加可读性1 #include "stdafx.h"//预编译头⽂件23 #include "test.h"//当前源代码对应的头⽂件45 #include <stdio.h> //C标准库67 #include <iostream> //C++标准库89 #include "library/read.h"//其它库头⽂件10 #include "library/write.h"1112 #include "one.h"//当前项⽬下其它头⽂件13 #include "two.h"4.局部变量初始化,声明变量后⽴即进⾏赋值初始化好处:避免未初始化产⽣的潜在错误1int nA = 0;2char szB = '\0';3float fC = 0.00f;4char szBuff[16] = {0}; //注意:初始化时指定的的元素个数⽐数组⼤⼩少,剩下的元素都回被初始化为05 StPeople tPeople = {0};5.类的初始化1class CStudent2 {3public:4 CStudent():m_nAge(0),m_fScore(0.00f){}5 CStudent(int nAge, float fScore):m_nAge(nAge),m_fScore(fScore){};6private:7int m_nAge;8float m_fScore;9 };10int _tmain(int argc, _TCHAR* argv[])11 {12 CStudent student; //使⽤⽆参的构造函数初始化 m_nAge=0 m_fScore=0.00f13 CStudent studentTwo(20,99.5); //使⽤初始化例表构造函数初始化 m_nAge=20 m_fScore=99.5f14 }6.局部变量是个对象,应该避免多次调⽤构造与析构1 //这⾥循环⼀千次,每次循环都得实例化对象,调⽤构造与析构2 for(int i = 0; i<1000; i++)3 {4 CTest test;5 test.Out();6 }7 //下⾯同样循环⼀千次,在外部实例化对象,只调⽤⼀次构造与析构8 CTest testTwo;9 for(int j = 0; j<1000; j++)10 {11 testTwo.Out();12 }7.结构体和类使⽤, 只有当成员全部为数据时使⽤结构体,其它时⼀律使⽤类.C++中结构体和类起到同样作⽤,唯⼀区别是结构体默认成员和⽅法是public,⽽类默认是private8.操作符重载,尽量不要⽤操作符重载,定义⼀个函数来处理显得更加直观1class CPerson2 {3public:4 CPerson(int nAge):m_nAge(nAge){}5//重载==运算符6bool operator==(const CPerson &ps)7 {8if (this->m_nAge == ps.m_nAge)9 {10return true;11 }12return false;13 }14//使⽤Equal函数15bool Equal(const CPerson &ps)16 {17return this->m_nAge == ps.m_nAge;18 }19private:20int m_nAge;21 };22int _tmain(int argc, _TCHAR* argv[])23 {24 CPerson person1(20);25 CPerson person2(20);26if(person1 == person2)27 {28 printf("person1 == person2\r\n");29 }3031if(person1.Equal(person2))32 {33 printf("person1 == person2\r\n");34 }3536 getchar();37 }9.将类的数据成员私有化,提供Get Set⽅法进⾏访问, 不使⽤对象,xxxx⽅式访问好处:提⾼代码封装性,有利于调试.当数据成员出错时,只需在Get Set⽅法下断调试即可. 反之使⽤对象.xxx⽅式访问,出错时需要在所有调⽤处下断,不利于调试. 1class CPerson2 {3public:4 CPerson(int nAge):m_nAge(nAge){}5int GetAge()6 {7return this->m_nAge;8 }9void SetAge(const int nAge)10 {11this->m_nAge = nAge;12 }13private:14int m_nAge;15 };16int _tmain(int argc, _TCHAR* argv[])17 {18 CPerson person1(20);19 printf("age = %d\r\n",person1.GetAge());20 person1.SetAge(30);21 getchar();22 }10.类中的声明顺序, 先声明public块,再声明protected块,再声明private块,这三块中声明的顺序⼀致1class CPerson2 {3public:4//typedef5 typedef vector<int> VectorInt;6//常量7const int m_kNum;8//构造和析构函数9 CPerson(int nAge):m_kNum(100),m_nAge(nAge){}10 ~CPerson(){}11//成员函数12int GetAge()13 {14return this->m_nAge;15 }16void SetAge(const int nAge)17 {18this->m_nAge = nAge;19 }20//数据成员21protected:22//声明顺序同上23private:24//声明顺序同上25int m_nAge;26 };11.编写短⼩的函数,尽量不要超过40⾏好处:⽅便提取重复代码进⾏封装,便于他⼈阅读和修改,⽅便调试12.不使⽤函数重载,直接使⽤函数名进⾏区分好处:过多的函数重载种类会使调⽤者⽆从选择1//函数重载2 CPerson* GetPerson(const int nAge);3 CPerson* GetPerson(const Sex emSex);4 CPerson* GetPerson(const char* pStrName);56//直接利⽤函数名进⾏区分7 CPerson* GetPersonFromAge(const int nAge);8 CPerson* GetPersonFromSex(const Sex emSex);9 CPerson* GetPersonFromName(const char* pStrName);13.函数参数禁⽌使⽤缺省参数好处:避免他⼈调⽤函数时错误的理解14.迭代器上使⽤前置⾃增⾃减(++i --i)好处:提⾼迭代器访问的执⾏效率, 相⽐后置⾃增⾃减⽽⾔15.当函数参数为对象时,尽量使⽤指针或者引⽤⽅式传递//直接传递,需要构造⼀个新的对象,这个新的对象⼜得构造和析构,影响性能void GetPeoson(const CPerson person);//使⽤指针或引⽤⽅式传递实参,不需要构造新的对象void GetPesSon(const CPerson *pPerson);void GetPeoson(const CPerson &person);16.使⽤sizeof(变量名),⽽不是使⽤sizeof(数据类型)好处:当修改变量的数据类型后,sizeof不需要同步更新成新的数据类型17.格式要求函数中返回值与函数名在同⼀⾏,如果参数过多需要进⾏换⾏并且对齐,每⼀⾏⼀个参数1void SetWindow(HWND hWnd,2int nWidth,3int nHeight,4int nX,5int nY,6 DWORD dwStyle);if和else if语句块的括号需要另起⼀⾏,⽅便阅读1if(aa > bb)2 {3//......4 }5else if(aa > cc)6 {7//.....8 }适当添加空格,使代码美观更利于阅读1int nA, nB, nC;2 nC = nA + nB;。

基于vc++的五子棋程序设计与实现大学论文

基于vc++的五子棋程序设计与实现大学论文

河北农业大学现代科技学院毕业论文(设计)题目:基于VC++的五子棋程序设计与实现摘要C++语言是一种面向对象的语言,尽管在当前,可视化语言发展迅速,普及很快,但C++语言作为一种基础的语言,它的有时依然存在,甚至有时它是不可替代的,特别是和硬件接口技术相联系的软件。

五子棋游戏是一种简单大众的游戏,自计算机实现以来,深受广大电脑玩家的喜爱,现在流行的五子棋游戏软件大多缺乏美观的界面,和容易的操作方法,电脑的AI值也不是很高。

本文通过C++语言在计算机图形方面的编程,设计了五子棋游戏软件,使该软件具有还算美观和操作简单的界面,在人机对战时,分为低级,中级和专家级,加大对游戏的乐趣,当然也可以实行人人对战。

本游戏是以C++语言作为开发工具,采用搜索算法设计最优落子点开发的游戏软件。

本文就是介绍五子棋软件设计的全过程。

关键字C++语言面向对象最优落子AbstractC + + language is an object-oriented language, although in the current, visual language developed rapidly, spread quickly, but the C + + language as a basic language, it is sometimes still exists, and sometimes it is irreplaceable, especially with hardware interface technology associated software. V olkswagen backgammon game is a simple game, since the computer to realize, the majority of PC gamers love, now popular backgammon game software lacks most beautiful interface, and easy method of operation, AI value of the computer is not very high. In this paper, C + + programming language in computer graphics, design a backgammon game software, so that the software has the appearance and operation is fairly simple interface, the man-machine war, divided into low, intermediate and expert level, increase the game fun, of course, can also be implemented for all war. This game is based on C + + language as a development tool, the search algorithm design optimal point developed game software. This article is to introduce the whole process of backgammon software design. Keyword C++ language Object-oriented the optimal initial目录1绪论 (5)1.1五子棋的简介 (5)1.2 Visual C++的介绍 (6)1.3 开发环境及运行环境 (6)1.3.1 开发环境 (6)1.3.2 运行环境 (6)2 系统分析 (7)2.1系统调研 (7)2.2可行性分析 (7)2.3 技术可行性分析 (7)3软件架构 (9)3.1 棋盘类 (9)3.1.1主要成员变量 (9)3.2 主要成员函数说明 (9)3.2.1 清空棋盘 (9)3.2.2 绘制棋子 (9)3.2.3 左键消息 (10)3.2.4 绘制棋盘 (10)3.2.5 对方落子完毕 (10)3.2.6 胜负的判断 (10)3.3 游戏模式类 (10)3.3.1主要成员变量 (10)3.3.2主要成员函数 (11)3.4 资源编辑 (11)3.5消息说明 (13)3.5.1落子消息 (14)3.5.2声音消息 (14)3.5.3提示消息 (14)3.5.4悔棋消息 (14)3.5.5输赢消息 (14)3.5.6再次开局消息 (14)4主要算法 (15)4.1判断胜负 (15)4.2人机对弈算法 (16)4.2.1获胜组合 (16)4.2.2落子后处理 (16)4.2.3查找棋盘空位 (16)4.2.4落子打分 (17)4.2.5防守策略 (17)4.2.6选取最佳落子 (17)5 软件实现 (18)5.1游戏运行 (18)6补充说明 (21)7结论 (22)致谢 (23)1绪论1.1五子棋的简介五子棋是起源于中国古代的传统黑白棋种之一。

预编译头的作用

预编译头的作用
预编译头的作用: 根据上文介绍,预编译头文件的作用当然就是提高便宜速度了,有了它你没有必要每次 都编译那些不需要经常改变的代码。编译性能当然就提高了。 预编译头的使用: 要使用预编译头,我们必须指定一个头文件,这个头文件包含我们不会经常改变的 代码和其他的头文件,然后我们用这个头文件来生成一个预编译头文件(.pch文件) 想必大家都知道 StdAfx.h这个文件。很多人都认为这是VC提供的一个“系统级别”的 ,编译器带的一个头文件。其实不是的,这个文件可以是任何名字的。我们来考察一个 典型的由AppWizard生成的MFC Dialog Based 程序的预编译头文件。(因为AppWizard 会为我们指定好如何使用预编译头文件,默认的是StdAfx.h,这是VC起的名字)。我们 会发现这个头文件里包含了以下的头文件: #ard components #include // MFC extensions #include // MFC Automation classes #include // MFC support for Internet Explorer 4 Common Controls #include 这些正是使用MFC的必须包含的头文件,当然我们不太可能在我们的工程中修改这些头文 件的,所以说他们是稳定的。 那么我们如何指定它来生成预编译头文件。我们知道一个头文件是不能编译的。所以我 们还需要一个cpp文件来生成.pch 文件。这个文件默认的就是StdAfx.cpp。在这个文件 里只有一句代码就是:#include “Stdafx.h”。原因是理所当然的,我们仅仅是要它能 够编译而已?D?D?D也就是说,要的只是它的.cpp的扩展名。
预编译头的概念: 所谓的预编译头就是把一个工程中的那一部分代码,预先编译好放在一个文件里(通常是 以.pch为扩展名的),这个文件就称为预编译头文件这些预先编译好的代码可以是任何的 C/C++代码,甚至是inline的函数,但是必须是稳定的,在工程开发的过程中不会 被经常改变。如果这些代码被修改,则需要重新编译生成预编译头文件。注意生成预编 译头文件是很耗时间的。同时你得注意预编译头文件通常很大,通常有6-7M大。注意及 时清理那些没有用的预编译头文件。 也许你会问:现在的编译器都有Time stamp的功能,编译器在编译整个工程的时候,它 只会编译那些经过修改的文件,而不会去编译那些从上次编译过,到现在没有被修改过 的文件。那么为什么还要预编译头文件呢?答案在这里,我们知道编译器是以文件为单 位编译的,一个文件经过修改后,会重新编译整个文件,当然在这个文件里包含的所有 头文件中的东西(.eg Macro, Preprocesser )都要重新处理一遍。VC的预编译头文件 保存的正是这部分信息。以避免每次都要重新处理这些头文件。

VC++6.0使用方法

VC++6.0使用方法

一、Visual C++ 6.0概述Visual C++6.0是微软公司推出的目前使用极为广泛的基于Windows平台的可视化集成开发环境,它和Visual Basic、Visual Foxpro、Visual J++等其它软件构成了Visual Studio(又名Developer Studio)程序设计软件包。

Developer Studio是一个通用的应用程序集成开发环境,包含了一个文本编辑器、资源编辑器、工程编译工具、一个增量连接器、源代码浏览器、集成调试工具,以及一套联机文档。

使用Visual Studio,可以完成创建、调试、修改应用程序等的各种操作。

VC++6.0提供面向对象技术的支持,它能够帮助使用MFC库的用户自动生成一个具有图形界面的应用程序框架。

用户只需在该框架的适当部分添加、扩充代码就可以得到一个满意的应用程序。

VC++6.0除了包含文本编辑器,C/C++混合编译器,连接器和调试器外,还提供了功能强大的资源编辑器和图形编辑器,利用“所见即所得”的方式完成程序界面的设计,大大减轻程序设计的劳动强度,提高程序设计的效率。

VC++的功能强大,用途广泛,不仅可以编写普通的应用程序,还能很好地进行系统软件设计及通信软件的开发。

二、使用Visual C++ 6.0建立C语言应用程序利用VC++6.0提供的一种控制台操作方式,可以建立C语言应用程序,Win32控制台程序(Win32 Console Application)是一类Windows程序,它不使用复杂的图形用户界面,程序与用户交互是通过一个标准的正文窗口,下面我们将对使用Visual C++ 6.0编写简单的C语言应用程序作一个初步的介绍。

1.安装和启动运行Visual Studio软件中的setup.exe程序,选择安装Visual C++ 6.0,然后按照安装程序的指导完成安装过程。

安装完成后,在开始菜单的程序选单中有Microsoft Visual Studio 6.0图标,选择其中的Microsoft Visual C++ 6.0即可运行(也可在Window桌面上建立一个快捷方式,以后双击即可运行)。

C++预编译头文件

C++预编译头文件

C++预编译头⽂件1、解决什么问题? C++ 编译器是单独,分别编译的,每个cpp⽂件,进⾏预编译(也就是对#include,define 等进⾏⽂本替换),⽣成编译单元。

编译单元是⼀个⾃包含⽂件,C++编译器对编译单元进⾏编译。

考虑,头⽂件A.h被多个cpp⽂件(⽐如A1.cpp,A2.cpp)包含,每个cpp⽂件都要进⾏单独编译,其中的A.h部分就会被多次重复第编译,影响效率。

2、怎么解决? 把A.h以及类似A.h这样的头⽂件,包含到stdafx.h中(当然也可以是其他⽂件),在stdafx.cpp中包含stdafx.h,设置stdafx.cpp⽂件的属性,预编译头设置为创建。

对于原先包含A.h的cpp⽂件,删除#include "A.h",改成包含stdafx.h,同时设置这些cpp⽂件(A1.cpp,A2.cpp)的属性,预编译头设置为使⽤。

这样的话,下次编译A1.cpp,A2.cpp的时候,对于A.h头⽂件中的那部分,就不需要编译了,节省时间。

3、预编译头⽂件原理 ⼯程对预先编译的代码进⾏编译,会⽣成⼀个pch⽂件(precompiled header),包含了编译的结果。

注意,可以对任何代码⽣成到pch中,但是⽣成pch是个很耗时的操作,因此,只对那些稳定的代码创建预编译头⽂件。

4、对于预编译头,分为:创建者,使⽤者,不使⽤者。

5、注意:现在的编译器都有Time Stramp 功能,当编译整个⼯程的时候,只编译那些修改的cpp⽂件。

但是,这并没有解决上⾯提到的问题。

考虑A1.cpp经常修改,每次修改,都要对包含的A.h头⽂件部分,进⾏编译。

6、Time Stramp:时间戳是指⽂件属性⾥的创建,修改,访问的时间。

每次,⽂件内容修改,时间戳都会更新为最新的时间,时间戳发⽣变化,说明⽂件被修改了。

补充说明:时间戳往往应⽤在同步,⽐如⾳频视频不同步。

举例来说,A,B两个⼈约定在⼀起,7点⼲什么,8点⼲什么,9点⼲什么,如果在7点没有同步,就算了,尽量保证8点同步。

stdafx.h预编译头

stdafx.h预编译头

(1)St‎a ndar‎d App‎l icat‎i on F‎r ame ‎E xten‎d没有函数‎库,只是定‎义了一些环‎境参数,使‎得编译出来‎的程序能在‎32位的操‎作系统环境‎下运行。

W‎i ndow‎s和MFC‎的incl‎u de文件‎都非常大,‎即使有一个‎快速的处理‎程序,编译‎程序也要花‎费相当长的‎时间来完成‎工作。

由于‎每个.CP‎P文件都包‎含相同的i‎n clud‎e文件,为‎每个.CP‎P文件都重‎复处理这些‎文件就显得‎很浪费了。

‎为避免这种‎浪费,Ap‎p Wiza‎r d和Vi‎s ual ‎C++编译‎程序一起进‎行工作,如‎下所示:‎ 1.A‎p pWiz‎a rd建立‎了文件st‎d afx.‎h,该文件‎包含了所有‎当前工程文‎件需要MF‎Cinc‎l ude ‎文件。

且这‎一文件可以‎随被选择的‎选项而变化‎。

‎2.App‎W izar‎d然后就建‎立stda‎f x.cp‎p。

这个文‎件通常都是‎一样的。

‎3.‎然后App‎W izar‎d就建立起‎工程文件,‎这样第一个‎被编译的文‎件就是st‎d afx.‎c pp。

‎4当‎V isua‎l C++‎编译std‎a fx.c‎p p文件时‎,它将结果‎保存在一个‎名为std‎a fx.p‎c h的文件‎里。

(扩展‎名pch表‎示预编译头‎文件)( ‎预编译头文‎件通过编译‎s tdaf‎x.cpp‎生成,以工‎程名命名,‎由于预编译‎的头文件的‎后缀是“p‎c h”,所‎以编译结果‎文件是pr‎o ject‎n ame.‎p ch。

)‎5‎.当Vis‎u alC+‎+编译随后‎的每个.c‎p p文件时‎,它阅读并‎使用它刚生‎成的.pc‎h文件。

‎Vi‎s ual ‎C++不再‎分析Win‎d ows ‎i nclu‎d e文件,‎除非你又编‎缉了std‎a fx.c‎p p或st‎d afx.‎h。

什么是预编译

什么是预编译

什么是预编译预编译又称为预处理,是做些代码文本的替换工作处理#开头的指令,比如拷贝#include 包含的文件代码,#define宏定义的替换,条件编译等就是为编译做的预备工作的阶段主要处理#开始的预编译指令预编译指令指示了在程序正式编译前就由编译器进行的操作,可以放在程序中的任何位置。

常见的预编译指令有:(1)#include 指令该指令指示编译器将xxx.xxx文件的全部内容插入此处。

若用<>括起文件则在系统的INCLUDE目录中寻找文件,若用" "括起文件则在当前目录中寻找文件。

一般来说,该文件是后缀名为"h"或"cpp"的头文件。

注意:<>不会在当前目录下搜索头文件,如果我们不用<>而用""把头文件名扩起,其意义为在先在当前目录下搜索头文件,再在系统默认目录下搜索。

(2)#define指令该指令有三种用法: 第一种是定义标识,标识有效范围为整个程序,形如#define XXX,常与#if配合使用;第二种是定义常数,如#define max 100,则max代表100(这种情况下使用const定义常数更好,原因见注1);第三种是定义"函数",如#define get_max(a, b) ((a)>(b)?(a):(b)) 则以后使用get_max(x,y)就可以得到x和y中较大的数(这种方法存在一些弊病,见注2)。

(3)#if、#else和#endif指令这些指令一般这样配合使用:#if defined(标识) //如果定义了标识要执行的指令#else 要执行的指令#endif 在头文件中为了避免重复调用(比如说两个头文件互相包含对方),常采用这样的结构:#if !(defined XXX) //XXX为一个在你的程序中唯一的标识符,//每个头文件的标识符都不应相同。

VC 中为何在每个CPP文件中必须要加入StdAfx.h头文件

VC  中为何在每个CPP文件中必须要加入StdAfx.h头文件

VC++中为何在每个CPP文件中必须要加入StdAfx.h头文件
首先,与StdAfx.h对应的还有一个StdAfx.cpp文件,他们的目的是一次编译,生成一个projectname.pch这样的一个预编译头文件,将其用于工程中所有的cpp文件,这样的话,如果工程中的某个cpp文件需要引用头文件的话,则只需要去引用预编译pch文件即可,无需引入头文件,从而避免了重新编译头文件的麻烦,由于MFC系统的头文件比较巨大,如果每个CPP都重新编译一遍头文件,将浪费过多的编译时间,故这种做法能大大加快编译速度。

其次,这就要求每个CPP如果要使用预编译头文件projectname.pch加快编译速度的话,VC默认的方式是通过在文件的中加入StdAfx.h的方法来告知编译器需要使用projectname.pch,当然,如果不使用预编译头文件,不想有这样的限制的话,可以在工程-&gt;设置-&gt;c/c++-&gt;预编译头文件中修改相关选项为不使用预编译头文件。

最后,使用预编译头文件技术,将工程中需要使用频繁,但修改不频繁的头文件放到StdAfx.h中,这样只需要在第一次编译时生成projectname.pch文件,之后只要StdAfx.h文件的内容没有改变,StdAfx.cpp将不需要重新编译,从而又一次提高了编译速度。

c++中预编译头文件名pch.h

c++中预编译头文件名pch.h
的项目属性中调整预编译头文件的名称
c++中预编译头文件名 pch.h
多年来,默认的预编译头文件名是stdafx.h。最近,在VS 2017中,他们将项目向导创建的默认名称更改为pch.h.我不知道为什么,但他们做 到了。 您可以在“配置属性” - >“C/C++” - >“预编译标题”下的“项目属性”中调整预编译头文件的名称。您也可以在那里启用或禁用它们。您甚至可以基 于每个文件来定义它。您甚至可以在一个项目中配置多个不同的预编译头文件。 所以对你来说具体问题:在你的教程中用pch.h替换stdafx.h不会有任何问题。该教程可能只是较旧,尚未更新。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
如何使用预编译头文件以提高编译速度?要使用预编译头文件,必须指定一个头文件(.H),它包含我们不会经常修改的代码和其他的头文件,然后用这个头文件(.H)来生成一个预编译头文件(.PCH),VC默认的头文件就是StdAfx.h,因为头文件是不能编译的,所以我们还需要一个.CPP文件来作桥梁,VC默认的文件为StdAfx.cpp,这个文件里只有一句代码就是:#include "StdAfx.h".接下来要用它生成.PCH文件,涉及到几个重要的预编译指令:/Yu,/Yc,/Yx,/Fp.简单地说,/Yc是用来生成.PCH文件的编译开关.在Project->setting->C/C++的Category里的Precompiled Header,然后在左边的树形视图中选择用来编译生成.PCH文件的.CPP文件(默认即StdAfx.cpp)你就可以看到/Yc这个开关,它表示这个文件编译了以后是否生成.PCH文件(可能/Yc的c表示create)./Fp指令指定生成的.PCH文件的名字及路径(可能/Fp的p代表path)./Yu的u即use使用,工程中只要包括了.H文件的文件都会有这个/Yu指令.如果选择自动Automatic...的话则原来为/Yc的地方就换成了/Yx指令.如果选择自动,则每次编译时编译器会看以前有没有生成过.PCH文件,有则不现生成否则就再次编译产生.PCH文件.
注意:
A,实际上,由Appzard项目向导生成的默认的头文件及CPP文件StdAfx.h和StdAfx.cpp可以是任何名字的.原因很简单.但如果你要这样做就要记得修改相应的Project->setting...下的几个预编译指令(/Yc,/Yu,/Yx,/Fp)的参数.
B.在任何一个包括了将要预编译的头文件而使用了.PCH文件的工程文件的开头,一定必须要是在最开头,要包含那个指定生成.PCH文件的.H文件(通过.CPP文件包括,默认为StdAfx.cpp),如果没包括将产生我最开头产生的错误.如果不是在最开头包括将产生让你意想不到的莫名其妙错误
(5) fatal error C1083: Cannot open include file: 'stdafx.h': No such file or directory如果根本没有stdafx.h,你为何要包含它.一般只有大工程才需要预编译头文件.stdafx.h删除这一行#include "stdafx.h"B project-> Settings->c/c++ category->Precomiled Headers 选择第一个 Not using precompiled headers
5.当VisualC++编译随后的每个.cpp文件时,它阅读并使用它刚生成的.pch文件。
Visual C++不再分析Windows include文件,除非你又编缉了stdafx.cpp或stdafx.h。在这个过程中你必须遵守以下规则:
1.你编写的任何.cpp文件都必须首先包含stdafx.h。
1.AppWizard建立了文件stdafx.h,该文件包含了所有当前工程文件需要MFC include 文件。且这一文件可以随被选择的选项而变化。
2.AppWizard然后就建立stdafx.cpp。这个文件通常都是一样的。
3.然后AppWizard就建立起工程文件,这样第一个被编译的文件就是stdafx.cpp。
预编译头文件通过编译stdafx.cpp生成,以工程名命名,由于预编译的头文件的后缀是“pch”,所以编译结果文件是projectname.pch。
编译器通过一个头文件stdafx.h来使用预编译头文件。stdafx.h这个头文件名是可以在project的编译设置里指定的。编译器认为,所有在指令#include "stdafx.h"前的代码都是预编译的,它跳过#include "stdafx. h"指令,使用projectname.pch编译这条指令之后的所有代码。
(1)Standard Application Frame Extend没有函数库,只是定义了一些环境参数,使得编译出来的程序能在32位的操作系统环境下运行。Windows和MFC的include文件都非常大,即使有一个快速的处理程序,编译程序也要花费相当长的时间来完成工作。由于每个.CPP文件都包含相同的include文件,为每个.CPP文件都重复处理这些文件就显得很浪费了。为避免这种浪费,AppWizard和Visual C++编译程序一起进行工作,如下所示:
为什么需要预编译头文件?一言以蔽之:提高编译速度.一般地,编译器以文件为单位编译,如果修改了一工程中的一个文件则所有文件都要重新编译,包括头文件里的所有东西(eg.Macro宏,Preprocessor预处理),而VC程序中,这些头文件中所包括的东西往往是非常大的,编译将占很长的时间.但它们又不常被修改,是较稳定的,为单独的一个小文件而重新编译整个工程的所有文件导致编译效率下降,因此引入了.PCH文件.
C Project->Settings->C/C++->Project Options中把/Fp"Debug/Your_Project_Name.pch"和/Yu"stdafx.h"两项删掉就可以了。要注意原来在stdafx.h内包含的文件要包含到各个.cpp文件中.
********************************************************************
(6)在*.cpp中的开头加入#include "stdafx.h".(#include "stdAfx.h" 放到另外#include的前面,也就是程序的最前面。使用预编译头文件需要把它放到程序最前面,否则它前面的内容会被忽略)如果不加#include "stdafx.h", 就会报这个错: fatal error C1010: unexpected end of file while looking for precompiled header directive。编译器通过一个头文件stdafx.h来使用预编译头文件。stdafx.h这个头文件名是可以在project的编译设置里指定的。编译器认为,所有在指令#include "stdafx.h"前的代码都是预编译的,它跳过#include "stdafx.h"指令,使用projectname.pch编译这条指令之后的所有代码。因此,所有的CPP实现文件第一条语句都是:#include "stdafx.h"。
3.#define WIN32_LEANAND_MEAN,在windows的头文件中拒绝接受MFC类库,以加速编译时间;
4.afx-afx中的af指的是Application Frame的缩写,曾经有一个技术开发团队专门作Application Frame,后来给这个团队命名用afx,x本身没有含义,只不过构成一个响亮的口号,后来就一直沿用下来。
(4)stdafx是预编译头文件。你可以从VC++集成环境菜单Project/Settings...中
Project Settings Dialog/C/C++/Category:Precompiled Headers/Use precompiled header file(.pch)的Check Box中看到。已经将Stdafx.h文件作为预编译的头文件来使用。预编译头文件是在编译所有Code之前,首先进行的动作。通过解析这个文件,取得定义的结构和参数。这样就不用在编译每个文件时都重新进行解析,提高编译速度。stdafx.h这个名称是可以改变的,你可以指定预编译头文件的名称。这个只在vc中有用,并不是c++的特性,vc中可以在这里声明全局变量和ID
#include "stdAfx.h " 放到另外#inc要把它放到程序最前面,否则它前面的内容会被忽略。
预编译头文件(一般扩展名为.PCH),是把一个工程中较稳定的代码预先编译好放在一个文件(.PCH)里.这些预先编译好的代码可以是任何的C/C++代码甚至可以是inline函数,它们在整个工程中是较为稳定的,即在工程开发过程中不会经常被修改的代码.
C.预编译文件.PCH生成之很耗时间,而且生成之后它也很占磁盘空间,常在5-6M,注意项目完成之后及时清理无用的.PCH文件以节约磁盘空间.
D.如果丢了或删了.PCH文件而以后要再修改工程文件时,可将指定的/Yc的.CPP文件(默认为StdAfx.cpp)重新编译一次即可再次生成.PCH文件,不用按F7或Rebuild All
#include "stdafx.h"这个语句的作用,是将该项目的目录中的stdafx.h这个文件包含到程序里,而你之所以遇到那个错误,是因为你的项目目录中没有stdafx.h这个文件该文件如果被需要,那么在你新建项目的时候,Visual studio会自动为你生成一个,否则的话你可以去掉#include"stdafx.h".很多程序前面都要加一句#include"stdafx.h" 这个语句并不是每个程序所必须有的所谓头文件预编译,就是把一个工程(Project)中使用的一些MFC标准头文件(如Windows.H、Afxwin.H)预先编译,以后该工程编译时,不再编译这部分头文件,仅仅使用预编译的结果。这样可以加快编译速度,节省时间。
2.如果你有工程文件里的大多数.cpp文件需要.h文件,顺便将它们加在stdafx.h(后部)上,然后预编译stdafx.cpp。
3.由于.pch文件具有大量的符号信息,它是你的工程文件里最大的文件。
相关文档
最新文档