ImageVerifierCode 换一换
格式:DOCX , 页数:21 ,大小:30.38KB ,
资源ID:22673518      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/22673518.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(9MFC预编译Word格式文档下载.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

9MFC预编译Word格式文档下载.docx

1、该指令指示编译器将xxx.xxx文件的全部内容插入此处。若用括起文件则在系统的INCLUDE目录中寻找文件,若用 括起文件则先在当前目录中寻找文件。一般来说,该文件是后缀名为h或cpp的头文件。注意:不会在当前目录下搜索头文件,如果我们不用(b)?(a):(b) 则以后使用get_max(x,y)就可以得到x和y中较大的数(这种方法存在一些弊病,见注2)。第四种是定义宏函数,如#define GEN_FUN(type) type max_#type(type a,type b)return ab?a:b; ,使用时,用GEN_FUN(int),则此处预编译后就变成了 max_int(int a

2、,int b)return a,(即对max_int(x,y)函数的声明)以后就可以使用max_int(x,y)就可以得到x和y中较大的数.比第三种,增加了类型的说明。(3)#if、#else和#endif指令这些指令一般这样配合使用:#if defined(标识) /如果定义了标识要执行的指令#else#endif此处是#if#else#endif三个配合使用在头文件中为了避免重复调用(比如说两个头文件互相包含对方),常采用这样的结构:#if !(defined XXX) /XXX为一个在你的程序中唯一的标识符,/每个头文件的标识符都不应相同。标识符的常见方法是若头文件名为abc.h则标识为

3、abc_h#define XXX真正的内容,如函数声明之类C+预编译一、预处理的由来在C+的历史发展中,有很多的语言特征(特别是语言的晦涩之处)来自于C语言,预处理就是其中的一个。C+从C语言那里把C语言预处理器继承过来(C语言预处理器,被Bjarne博士简称为Cpp,不知道是不是C Program Preprocessor的简称)。二、常见的预处理功能预处理器的主要作用就是把通过预处理的内在功能对一个资源进行等价替换,最常见的预处理有:文件包含条件编译布局控制宏替换4种。文件包含:#include 是一种最为常见的预处理,主要是作为文件的引用组合源程序正文。宏替换:#define,这是最常见

4、的用法,它可以定义符号常量、函数功能、重新命名、字符串的拼接等各种功能。条件编译:#if, #ifdef,#ifndef, #endif,#undef等也是比较常见的预处理,主要是进行编译时进行有选择的挑选,注释掉一些指定的代码,以达到版本控制、防止对文件重复包含的功能。布局控制:#pragma,这也是我们应用预处理的一个重要方面,主要功能是为编译程序提供非常规的控制流信息。三、预处理指令预处理指令的格式如下:#directive tokens#符号应该是这一行的第一个非空字符,一般我们把它放在起始位置。如果指令一行放不下,可以通过“”进行控制,例如:#define Error if(erro

5、r) exit(1)等价于#define Error if(error) exit(1)下面我们看一下常见的预处理指令:#define 宏定义#undef 未定义宏#include 文本包含#ifdef 如果宏被定义就进行编译#ifndef 如果宏未被定义就进行编译#endif 结束编译块的控制#if 表达式非零就对代码进行编译#else 作为其他预处理的剩余选项进行编译#elif 这是一种#else和#if的组合选项 /后面有例子的#line 改变当前的行数和文件名称#error 输出一个错误信息#pragma 为编译程序提供非常规的控制流信息下面我们对这些预处理进行一一的说明,考虑到宏的重

6、要性和繁琐性,我们把它放到最后讲。四、文件包含指令这种预处理使用方式是最为常见的,平时我们编写程序都会用到,最常见的用法是:iostream /标准库头文件iostream.h /旧式的标准库头文件IO.h /用户自定义的头文件./file.h /UNIX下的父目录下的头文件/usr/local/file.h /UNIX下的完整路径.file.h /Dos下的父目录下的头文件usrlocalfile.h /Dos下的完整路径这里面有2个地方要注意:1、我们用还是?我们主张使用,而不是:首 先,.h格式的头文件早在98年9月份就被标准委员会抛弃了,我们应该紧跟标准,以适合时代的发展。其次,ios

7、tream.h只支持窄字符集, iostream则支持窄/宽字符集。还有,标准对iostream作了很多的改动,接口和实现都有了变化。最后,iostream组件全部放入 namespace std中,防止了名字污染。2、和io.h的区别?其实他们唯一的区别就是搜索路径不同:对于#include ,编译器从标准库路径开始搜索对于#include ,编译器从用户的工作路径开始搜索。五、编译控制指令这些指令的主要目的是进行编译时进行有选择的挑选,注释掉一些指定的代码,以达到版本控制、防止对文件重复包含的功能。使用格式,如下:1、如果identifier为一个定义了的符号,your code就会被编译

8、,否则剔除。#ifdef identifieryour code2、如果identifier为一个未定义的符号,your code就会被编译,否则剔除。#ifndef identifier3、如果expression非零,your code就会被编译,否则剔除。#if expression4、如果identifier为一个定义了的符号,your code1就会被编译,否则your code2就会被编译。your code1your code25、如果epression1非零,就编译your code1,否则,如果expression2非零,就编译your code2,否则,就编译your co

9、de3。#if expressin1#elif expression2your code3#enif其他预编译指令除了上面我们说的集中常用的编译指令,还有3种不太常见的编译指令:#line#error#pragma我们接下来就简单的谈一下。#line的语法如下:#line number filename例如:#line 30 a.h其 中,文件名a.h可以省略不写。这条指令可以改变当前的行号和文件名,例如上面的这条预处理指令就可以改变当前的行号为30,文件名是a.h。初看起来似乎没有什么用,不过,他还是有点用的,那就是用在编译器的编写中,我们知道编译器对C+源码编译过程中会产生一些中间文件,通

10、过这条指令,可以保证文件名是固定的,不会被这些中间文件代替,有利于进行分析。#error语法如下:#error info#ifndef UNIX#error This software requires the UNIX OS./出现前面一行的情况就弹出错误提示窗口这条指令主要是给出错误信息,上面的这个例子就是,如果没有在UNIX环境下,就会输出This software requires the UNIX OS.然后诱发编译器终止。所以总的来说,这条指令的目的就是在程序崩溃之前能够给出一定的信息。#pragma是非统一的,他要依靠各个编译器生产者。例如VC+中:#pragma comment

11、(lib,dllTest.lib)导入库dllTest.lib。六、预定义标识符为了处理一些有用的信息,预处理定义了一些预处理标识符,虽然各种编译器的预处理标识符不尽相同,但是他们都会处理下面的4种:_FILE_ 正在编译的文件的名字_LINE_ 正在编译的文件的行号_DATE_ 编译时刻的日期字符串,例如:25 Jan 2006_TIME_ 编译时刻的时间字符串,例如:12:30:55coutThe file is :_FILE_! The lines is:_LINE_ Visual Studio 6.0 Document - Visual C+ 6.0 Document - VC+ Pr

12、ogrammer Guider - Compiler and Linker - Details - Creating Precompiled Header files预编译头的概念:所谓的预编译头就是把一个工程中的那一部分代码,预先编译好放在一个文件里(通常是以.pch为扩展名的),这个文件就称为预编译头文件这些预先编译好的代码可以是任何的C/C+代码,甚 至是inline的函数,但是必须是稳定的,在工程开发的过程中不会被经常改变。如果这些代码被修改,则需要重新编译生成预编译头文件。注意生成预编译头文件是很耗时间的。同时你得注意预编译头文件通常很大,通常有6-7M大。注意及时清理那些没有用的预

13、编译头文件。也许你会问:现在的编译器都有Time stamp的功能,编译器在编译整个工程的时候,它只会编译那些经过修改的文件,而不会去编译那些从上次编译过,到现在没有被修改过的文件。那么为什么还 要预编译头文件呢?答案在这里,我们知道编译器是以文件为单位编译的,一个文件经过修改后,会重新编译整个文件,当然在这个文件里包含的所有头文件中的东西(.eg Macro, Preprocessor )都要重新处理一遍。VC的预编译头文件保存的正是这部分信息。以避免每次都要重新处理这些头文件。根据上文介绍,预编译头文件的作用当然就是提高便宜速度了,有了它你没有必要每次都编译那些不需要经常改变的代码。编译性

14、能当然就提高了。要使用预编译头,我们必须指定一个头文件,这个头文件包含我们不会经常改变的代码和其他的头文件,然后我们用这个头文件来生成一个预编译头文件(.pch文 件)想必大家都知道 StdAfx.h这个文件。很多人都认为这是VC提供的一个“系统级别”的,编译器带的一个头文件。其实不是的,这个文件可以是任何名字的。我们来考察一个典型的由AppWizard生成的MFC Dialog Based程序的预编译头文件。(因为AppWizard会为我们指定好如何使用预编译头文件,默认的是StdAfx.h,这是VC起的名字)。我们会发现这个头文件里包含了以下的头文件:afxwin.h / MFC core

15、 and standard componentsafxext.h / MFC extensionsafxdisp.h / MFC Automation classesafxdtctl.h / MFC support for Internet Explorer 4 Common Controlsafxcmn.h 这些正是使用MFC的必须包含的头文件,当然我们不太可能在我们的工程中修改这些头文件的,所以说他们是稳定的。那么我们如何指定它来生成预编译头文件。我们知道一个头文件是不能编译的。所以我们还需要一个cpp文件来生成.pch 文件。这个文件默认的就是StdAfx.cpp。在这个文件里只有一句代

16、码就是:#include “Stdafx.h”。原因是理所当然的,我们仅仅是要它能够编译而已也就是说,要的只是它的.cpp的扩展名。我们可以用/Yc编译开关来指定 StdAfx.cpp来生成一个.pch文件,通过/Fp编译开关来指定生成的pch文件的名字。打开project -Setting-C/C+ 对话框。把Category指向Precompiled Header。在左边的树形视图里选择整个工程。我们可以使用预编译头功能了。以下是注意事项:1):如果使用了/Yu,就是说使用了预编译,我们在每个.cpp文件的最开头,我强调一遍是最开头,包含你指定产生pch文件的.h文件(默认是stdafx.

17、h)不然就会有问题。 如果你没有包含这个文件,就告诉你Unexpected file end. 如果你不是在最开头包含的,你自己试一下就知道了,绝对有很惊人的效果。2) 如果你把pch文件不小心丢了,根据以上的分析,你只要让编译器生成一个pch文件就可以了。也就是说把stdafx.cpp(即指定/Yc的那个cpp文件)重新编译一遍就可以了。当然你可以傻傻的 Rebuild all。简单一点就是选择那个cpp文件,按一下Ctrl + F7就可以了。在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。#pragma指令对每个编译

18、器给出了一个方法,在保持与C和C+语言完全兼容的情况下,给出主机或操作系统专有的特征。依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的。一般格式其格式一般为: #pragma Para。其中Para 为参数,下面来看一些常用的参数常用参数#pragma message参数Message 参数能够在编译信息输出窗口中输出相应的信息,这对于源代码信息的控制是非常重要的。其使用方法为:1#pragmamessage(消息文本当编译器遇到这条指令时就在编译输出窗口中将消息文本打印出来。当我们在程序中定义了许多宏来控制源代码版本的时候,我们自己有可能都会忘记有没有正确的设置这些宏,此

19、时我们可以用这条指令在编译的时候就进行检查。假设我们希望判断自己有没有在源代码的什么地方定义了_X86这个宏可以用下面的方法23#ifdef_X86 _X86macroactivated!) 当我们定义了_X86这个宏以后,应用程序在编译时就会在编译输出窗口里显示“_X86 macro activated! ”。我们就不会因为不记得自己定义的一些特定的宏而抓耳挠腮了。#pragma code_seg另一个使用得比较多的pragma参数是code_seg。格式如:code_seg(section-name,section-class)它能够设置程序中函数代码存放的代码段,当我们开发驱动程序的时候

20、就会使用到它。#pragma once(比较常用)只要在头文件的最开始加入这条指令就能够保证头文件被编译一次,这条指令实际上在VC6中就已经有了,但是考虑到兼容性并没有太多的使用它。#pragma once是编译相关,就是说这个编译系统上能用,但在其他编译系统不一定可以,也就是说移植性差,不过现在基本上已经是每个编译器都有这个定义了。#ifndef,#define,#endif这个是C+语言相关,这是C+语言中的宏定义,通过宏定义避免文件多次编译。所以在所有支持C+语言的编译器上都是有效的,如果写的程序要跨平台,最好使用这种方式#pragma hdrstop#pragma hdrstop表示预

21、编译头文件到此为止,后面的头文件不进行预编译。BCB可以预编译头文件以加快链接的速度,但如果所有头文件都进行预编译又可能占太多磁盘空间,所以使用这个选项排除一些头文件。有时单元之间有依赖关系,比如单元A依赖单元B,所以单元B要先于单元A编译。#pragma resource#pragma warningwarning(disable:450734;once:4385;error:164)等价于:450734)/不显示4507和34号警告信息 warning(once:4385)/4385号警告信息仅报告一次 warning(error:164)/把164号警告信息作为一个错误。同时这个prag

22、ma warning 也支持如下格式:warning(push,n) warning(pop)这里n代表一个警告等级(1-4)。warning(push)保存所有警告信息的现有的警告状态。warning(push,n)保存所有警告信息的现有的警告状态,并且把全局警告等级设定为n。warning(pop)向栈中弹出最后一个警告信息,在入栈和出栈之间所作的一切改动取消。456warning(push) 4705) 4706) 4707) /. 在这段代码的最后,重新保存所有的警告信息(包括4705,4706和4707)。#pragma commentcomment(.)该指令将一个注释记录放入一个对象文件或可执行文件中。常用的lib关键字,可以帮我们连入一个库文件。每个编译程序可以用#pragma指令激活或终止该编译程序支持的一些编译功能。例如,对循环优化功能:loop_opt(on)/激活 loop_opt(off)/终止有时,程序中会有些函数会使编译器发出你熟知而想忽略的警告,如“Parameter xxx is never used in function xxx”可以这样:warn100/Turnoffthewarningmessageforwarning#100

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1