[信息与通信]C基础知识.doc

上传人:sccc 文档编号:4663494 上传时间:2023-05-05 格式:DOC 页数:63 大小:405KB
返回 下载 相关 举报
[信息与通信]C基础知识.doc_第1页
第1页 / 共63页
[信息与通信]C基础知识.doc_第2页
第2页 / 共63页
[信息与通信]C基础知识.doc_第3页
第3页 / 共63页
[信息与通信]C基础知识.doc_第4页
第4页 / 共63页
[信息与通信]C基础知识.doc_第5页
第5页 / 共63页
点击查看更多>>
资源描述

《[信息与通信]C基础知识.doc》由会员分享,可在线阅读,更多相关《[信息与通信]C基础知识.doc(63页珍藏版)》请在三一办公上搜索。

1、第一章面向对象及C+基础知识课程内容: 1、面向对象程序设计基础知识(识记) 2、基本程序结构(综合应用) 3、类型修饰符(领会) 4、函数原型(综合应用) 5、内联函数(综合应用) 6、引用(综合应用) 7、动态内存分配(简单应用) 8、编译指令(领会) 9、改变习惯重新思考(识记)11面向对象程序设计基础知识: 程序语言:本身实际上是对一个现实问题的描述;其发展的根本问题在于如何更加接近人的自然思维。(机器汇编高级语言;面向过程面向对象)面向对象: 一种软件方法(方法学),而不仅仅限于程序设计语言,更重要的是如何看待世界。 基本思想:从现实世界中客观存在的事务(对象)出发来构造软件系统,并

2、在系统构造中尽可能运用人类的自然思维方式。 面向对象程序设计语言: 定义:机器实现的定义。 数据和操作在一起,内存块可以复制副本 对象间通过函数调用实现通信;对象的继承 关键要素: 抽象:忽略事物的非本质特性,只注意与当前目标有关的本质特征,从而找出事物的共性;把具有共同性质的事物划为一类,得到一个抽象的概念。 封装:将一组数据和与这组数据有关的操作集合组装在一起,形成一个能动的实体,也就是对象。(意义:对象集中而完整的描述并对应一个具体的事物,封装的信息隐蔽作用反映了事物的相对独立性;减少“波动效应”。副作用:增加了许多只负责读写的服务。) 继承:特殊类的对象拥有其一般类的对象的全部属性与服

3、务,称作特殊类对一般类的继承。 多态:一般类中定义的属性或服务被特殊类继承之后,可以具有不同的数据类型或表现出不同的行为。(目前不要求OOPL支持) C+语言的来龙去脉:对C语言进行面向对象的扩展。一种混合型OOPL。C语言的一个超集,语法基本使用C的语法,引入了新的概念支持OO的特性12C+基本程序结构:讨论C+对C的一些改进风格:1)输入输出:cin和cout代替printf, iostream.h代替stdio.h,更加方便。2)注释:“/”的引入 3)使用const(代替无参数宏)和内联函数(代替有参数宏)代替宏定义 4)函数原型(更强的编译时刻的检查)和缺省参数(方便函数调用、减少错

4、误) 5)新的动态内存分配函数new/delete:使用上更加简单 6)新的换行符 endl内联函数inline: 1)不是用函数调用的机制,编译遇到时简单的替换而已,省去了函数调用的额外开销 2)使用宏定义的副作用:# define f (x) (x+1); 在后面使用 f(1)展开成:(x) (x+1) (1),报编译错,但容易发现参数中有表达式: # define floor(x,b) x=b?0:1, 调用:if(floor(a&0x0f,0x07) / . 展开成:if (a&0x0f0x07?0:1). ;&优先级低于,产生错误。 难发现,好解决加括号#define band(x)

5、 (x)5 & (x)10) ? (x) : 0) 下面的执行结果如何? for(int i = 4; i 11; i+) int a = i; out a = a endl t; out band(+a)= band(+a) endl; out t a = a endl; 展开后会影响到a的值(a)。这一点和函数调用不同(函数一般传值)。宏没有作用域的问题引用: 1)使引用和原来定义的变量一样无区别的操作内存的某一空间。 2)最主要用途:建立函数参数传递的引用传递方式,不必使用指针;另一个用途:返回引用的函数,用于赋值运算符的左边。 3)两种情况下引用的是临时变量:对常量(或const修饰的

6、变量)的引用;引用类型和初始化时使用的变量类型不一致。4)定义返回引用了函数时,不要返回局部变量的引用。编译指令:不是C+的一部分,提供给编译器使用 1)嵌入指令:# include / # include “filename” 2)宏定义:# define 宏名 替换正文 3)条件编译指令:# if, # else, # endif, #defined13改变习惯重新思考C+不仅仅是在语法上对C的扩展,改变的是整个程序设计的方式和思路几个掌握C+新特性的途径(目前)14辅导教材这部分内容主要是最基本的C语言和C的知识。头文件和预处理指令: # include # include “文件名.扩

7、展名”# ifndef:为了防止宏的重复定义数据和表达式:词法符号关键字:C的保留字,具有自己确定的意义;不能被重新定义为标识符。标识符:用作变量名、函数名、类型名。规则:以字母或下划线开头,后面可跟数字、下划线及大小写字母。长度限制由具体编译器决定。标点:语法要求,无实际意义。基本数据类型:基本类型:char、int、float、double、void 修饰符:signed/unsighed、short/long 常量:整常量(十进制、八进制:0开始、十六进制:0x开始)、浮点常量(double,可以强制转换为float:最后加F)、字符常量(包括C预定义的转义序列) 字符串:用双引号括起来

8、的字符序列。只用空格隔开的两个串表示一个。 枚举类型:enum 枚举标记 枚举常量,枚举常量,简单变量的说明和初始化:数据类型 变量名1,变量名2,变量名n; 存储类: 四种存储类:auto、register、static、extern 两种修饰符:const、volatile运算符及优先级赋值及运算顺序语句: 表达式语句、空语句、块语句 选择语句 循环语句 转移语句 return语句数组: 一维数组: 数组元素类型 数组名数组大小 多维数组:数组的数组指针:声明:type * name;使用:int * pointer; pointer:指针,保存一个地址 *pointer:指针指向的内容

9、pointer = &I (int I) &(*pointer),*(&var)运算:对地址的运算指针和数组:元素为指针的数组和指向数组的指针 引用:产生一个变量的别名 说明: 类型 & 引用名 引用变量 引用参数:函数参数的传递方式 返回引用的函数:将函数用于赋值的左边 void类型指针:可以指向任一类型的C+对象,避免设计指针类型匹配的错误。将void类型的指针置给其它类型的指针时,必须使用强制类型转换。指针和const关键字: const int *p; int const *p类型定义: typedef 类型名 新名(如:typedef int INTEGER)串: 以0结尾的字符数组

10、。可以声明为数组或者指针: char * str = “new string”; char str = “new string”;字符串操作函数:string.h char *strcat( char *strDestination, const char *strSource ); char *strcpy( char *strDestination, const char *strSource ); int strcmp( const char *string1, const char *string2 );第1集初次与异常处理编程相邂逅 和其它很多程序员一样,本书的主人公阿愚也是在初学C

11、+时,在C+的sample代码中与异常处理的编程方法初次邂逅的,如下: / Normal program statements.try/ Execute some code that might throw an exception.catch( CException* e )/ Handle the exception here./ e contains information about the exception.e-Delete();/ Other normal program statements瞧瞧,代码看上去显得那么整齐、干净,try block和catch block遥相呼应,

12、多有对称美呀!因此主人公初次见面后就一见钟情了。为什么要选用异常处理的编程方法?当然更为重要的是,C+中引入的异常处理的编程机制提供给程序员一种全新的、更好的编程方法和思想。在C+中明确提出trycatch异常处理编程方法的框架之前的年代,程序员是怎样编写程序的,如下:void main(int argc, char* argv)if (Call_Func1(in, param out)/ 函数调用成功,我们正常的处理if (Call_Func2(in, param out)/ 函数调用成功,我们正常的处理while(condition)/do other jobif (has error)/

13、 函数调用失败,表明程序执行过程中出现一些错误,/ 因此必须处理错误 process_error();exit();/do other jobelse/ 函数调用失败,表明程序执行过程中出现一些错误,/ 因此必须处理错误 process_error();exit();else/ 函数调用失败,同样是错误处理process_error();exit();因为程序的执行过程中总会遇到许多可预知或不可预知的错误事件,例如说,由于内存资源有限导致需要分配的内存失败了;或某个目录下本应存在的一个文件找不着了;或说不小心被零除了、内存越界了、数组越界了等等。这些错误事件存在非常大的隐患,因此程序员总需要在

14、程序中不断加入if语句,来判断是否有异常出现,如果有,就必须要及时处理,否则可能带来意想不到的,甚至是灾难性的后果。这样一来,程序可读性差了很多,总是有许多与真正工作无关的代码,而且也给程序员增加了极大的工作负担,多数类似的处理错误的代码模块就像满山的牛屎一样遍地都是(程序员不大多是“牛”人吗?所以。哈哈)。但C+中的异常处理的机制彻底改变了这种面貌,它使真正的计算处理和错误处理分开来,让程序员不再被这些琐碎的事情所烦扰,能关注于真正的计算处理工作。同时代码的可读性也好了。因此我们有理由选择异常处理的编程方法。具体原因如下:1、 把错误处理和真正的工作分开来;2、 代码更易组织,更清晰,复杂的

15、工作任务更容易实现;3、 毫无疑问,更安全了,不至于由于一些小的疏忽而使程序意外崩溃了;4、 由于C+中的try catch可以分层嵌套,所以它提供了一种方法使得程序的控制流可以安全的跳转到上层(或者上上层)的错误处理模块中去。(不同于return语句,异常处理的控制流是可以安全地跨越一个或多个函数 )。5、 还有一个重要的原因就是,由于目前需要开发的软件产品总是变得越来越复杂、越来越庞大,如果系统中没有一个可靠的异常处理模型,那必定是一件十分糟糕的局面。相信绝大多数程序员都知道C+中的异常处理的编程方法,可还是有很多人已习惯原来单纯的面向过程的代码组织方式,不太习惯或较少使用trycatch

16、异常处理。为了使您编写的代码更安全;为了使您编写的代码让他人更易阅读,主人公阿愚强烈建议在您书写的代码中尽可能多用异常处理机制,少一些不必要的if判断语句。第2集C+中异常处理的游戏规则 如果您喜欢玩一款游戏,您必须先要很好理解这款游戏的规则。同样主人公阿愚喜欢上C+中异常处理后,当然也首先关注它的游戏规则,这就是C+中异常处理的语法。 关键字1、 try2、 catch3、 throw其中关键字try表示定义一个受到监控、受到保护的程序代码块;关键字catch与try遥相呼应,定义当try block(受监控的程序块)出现异常时,错误处理的程序模块,并且每个catch block都带一个参数

17、(类似于函数定义时的数那样),这个参数的数据类型用于异常对象的数据类型进行匹配;而throw则是检测到一个异常错误发生后向外抛出一个异常事件,通知对应的catch程序块执行对应的错误处理。语法1、还是给一个例子吧!如下:int main()cout In main. endl;/定义一个try block,它是用一对花括号所括起来的块作用域的代码块trycout 在 try block 中, 准备抛出一个异常. endl;/这里抛出一个异常(其中异常对象的数据类型是int,值为1)/由于在try block中的代码是受到监控保护的,所以抛出异常后,程序的/控制流便转到随后的catch bloc

18、k中throw 1;cout 在 try block 中, 由于前面抛出了一个异常,因此这里的代码是不会得以执行到的 endl;/这里必须相对应地,至少定义一个catch block,同样它也是用花括号括起来的catch( int& value )cout 在 catch block 中, 处理异常错误。异常对象value的值为: value endl;cout Back in main. Execution resumes here. endl;return 0;2、语法很简单吧!的确如此。另外一个try block可以有多个对应的catch block,可为什么要多个catch block

19、呢?这是因为每个catch block匹配一种类型的异常错误对象的处理,多个catch block呢就可以针对不同的异常错误类型分别处理。毕竟异常错误也是分级别的呀!有致命的、有一般的、有警告的,甚至还有的只是事件通知。例子如下:int main()trycout 在 try block 中, 准备抛出一个int数据类型的异常. endl;throw 1;cout 在 try block 中, 准备抛出一个double数据类型的异常. endl;throw 0.5;catch( int& value )cout 在 catch block 中, int数据类型处理异常错误。” endl;cat

20、ch( double& d_value )cout 在 catch block 中, double数据类型处理异常错误。” endl;return 0;3、一个函数中可以有多个trycatch结构块,例子如下:int main()trycout 在 try block 中, 准备抛出一个int数据类型的异常. endl;throw 1;catch( int& value )cout 在 catch block 中, int数据类型处理异常错误。” endl;/这里是二个trycatch结构块,当然也可以有第三、第四个,甚至更多trycout 在 try block 中, 准备抛出一个doubl

21、e数据类型的异常. endl;throw 0.5;catch( double& d_value )cout 在 catch block 中, double数据类型处理异常错误。” endl;return 0;4、上面提到一个try block可以有多个对应的catch block,这样便于不同的异常错误分类处理,其实这只是异常错误分类处理的方法之一(暂且把它叫做横向展开的吧!)。另外还有一种就是纵向的,也即是分层的、trycatch块是可以嵌套的,当在低层的trycatch结构块中不能匹配到相同类型的catch block时,它就会到上层的trycatch块中去寻找匹配到正确的catch bl

22、ock异常处理模块。例程如下:int main()try/这里是嵌套的trycatch结构块trycout 在 try block 中, 准备抛出一个int数据类型的异常. endl;throw 1;catch( int& value )cout 在 catch block 中, int数据类型处理异常错误。” endl;cout 在 try block 中, 准备抛出一个double数据类型的异常. endl;throw 0.5;catch( double& d_value )cout 在 catch block 中, double数据类型处理异常错误。” endl;return 0;5、讲

23、到是trycatch块是可以嵌套分层的,并且通过异常对象的数据类型来进行匹配,以找到正确的catch block异常错误处理代码。这里就不得不详细叙述一下通过异常对象的数据类型来进行匹配找到正确的catch block的过程。(1) 首先在抛出异常的trycatch块中查找catch block,按顺序先是与第一个catch block块匹配,如果抛出的异常对象的数据类型与catch block中传入的异常对象的临时变量(就是catch语句后面参数)的数据类型完全相同,或是它的子类型对象,则匹配成功,进入到catch block中执行;否则到二步;(2) 如果有二个或更多的catch bloc

24、k,则继续查找匹配第二个、第三个,乃至最后一个catch block,如匹配成功,则进入到对应的catch block中执行;否则到三步;(3) 返回到上一级的trycatch块中,按规则继续查找对应的catch block。如果找到,进入到对应的catch block中执行;否则到四步;(4) 再到上上级的trycatch块中,如此不断递归,直到匹配到顶级的trycatch块中的最后一个catch block,如果找到,进入到对应的catch block中执行;否则程序将会执行terminate()退出。另外分层嵌套的trycatch块是可以跨越函数作用域的,例程如下:void Func()

25、 throw()/这里实际上也是嵌套在里层的trycatch结构块trycout 在 try block 中, 准备抛出一个int数据类型的异常. endl;/由于这个trycatch块中不能找到匹配的catch block,所以/它会继续查找到调用这个函数的上层函数的trycatch块。throw 1;catch( float& value )cout 在 catch block 中, int数据类型处理异常错误。” endl;int main()tryFunc();cout 在 try block 中, 准备抛出一个double数据类型的异常. endl;throw 0.5;catch(

26、double& d_value )cout 在 catch block 中, double数据类型处理异常错误。” endl;catch( int& value )/这个例子中,Func()函数中抛出的异常会在此被处理cout 在 catch block 中, int数据类型处理异常错误。” endl;return 0;6、刚才提到,嵌套的trycatch块是可以跨越函数作用域的,其实这里面还有另外一层涵义,就是抛出异常对象的函数中并不一定必须存在trycatch块,它可以是调用这个函数的上层函数中存在trycatch块,这样这个函数的代码也同样是受保护、受监控的代码;当然即便是上层调用函数不

27、存在trycatch块,也只是不能找到处理这类异常对象错误处理的catch block而已,例程如下:void Func() throw()/这里实际上也是嵌套在里层的trycatch结构块/由于这个函数中是没有trycatch块的,所以它会查找到调用这个函数的上/层函数的trycatch块中。throw 1;int main()try/调用函数,注意这个函数里面抛出一个异常对象Func();cout 在 try block 中, 准备抛出一个double数据类型的异常. endl;throw 0.5;catch( double& d_value )cout 在 catch block 中,

28、double数据类型处理异常错误。” endl;catch( int& value )/这个例子中,Func()函数中抛出的异常会在此被处理cout 在 catch block 中, int数据类型处理异常错误。” endl;/如果这里调用这个函数,那么由于main()已经是调用栈的顶层函数,因此不能找/到对应的catch block,所以程序会执行terminate()退出。Func();/ 特别提示:在C+标准中规定,可以在程序任何地方throw一个异常对象,/ 并不要求一定只能是在受到try block监控保护的作用域中才能抛出异常,但/ 如果在程序中出现了抛出的找不到对应catch b

29、lock的异常对象时,C+标/ 准中规定要求系统必须执行terminate()来终止程序。/ 因此这个例程是可以编译通过的,但运行时却会异常终止。这往往给软件/ 系统带来了不安全性。与此形成对比的是java中提供的异常处理模型却是不/ 永许出现这样的找不到对应catch block的异常对象,它在编译时就给出错误/ 提示,所以java中提供的异常处理模型往往比C+要更完善,后面的章节/ 会进一步对这两种异常处理模型进行一个详细的分析比较。return 0;朋友们!C+中的异常处理模型的语法很简单吧!就是那么(one、two、three、哈哈!数数呢!)简单的几条规则。怪不得主人公阿愚这么快就喜

30、欢上她了,而且还居然像一个思想家一样总结出一条感想:好的东西往往都是简单的,简单就是美吗!哈哈!还挺臭美的。第3集C+中catch()如何使用 上一篇文章中详细讲了讲C+异常处理模型的trycatch使用语法,其中catch关键字是用来定义catch block的,它后面带一个参数,用来与异常对象的数据类型进行匹配。注意catch关键字只能定义一个参数,因此每个catch block只能是一种数据类型的异常对象的错误处理模块。如果要想使一个catch block能抓获多种数据类型的异常对象的话,怎么办?C+标准中定义了一种特殊的catch用法,那就是” catch()”。 感性认识1、catc

31、h()到底是一个什么样的东东,先来个感性认识吧!看例子先:int main()trycout 在 try block 中, 准备抛出一个异常. endl;/这里抛出一个异常(其中异常对象的数据类型是int,值为1)throw 1;/catch( int& value )/注意这里catch语句catch( )cout 在 catch() block 中, 抛出的int类型的异常对象被处理 endl;2、哈哈!int类型的异常被catch()抓获了,再来另一个例子:int main()trycout 在 try block 中, 准备抛出一个异常. endl;/这里抛出一个异常(其中异常对象的数

32、据类型是double,值为0.5)throw 0.5;/catch( double& value )/注意这里catch语句catch( )cout 在 catch() block 中, double类型的异常对象也被处理 endl;3、同样,double类型的异常对象也被catch()块抓获了。是的,catch(.)能匹配成功所有的数据类型的异常对象,包括C+语言提供所有的原生数据类型的异常对象,如int、double,还有char*、int*这样的指针类型,另外还有数组类型的异常对象。同时也包括所有自定义的抽象数据类型。例程如下:int main()trycout 在 try block

33、中, 准备抛出一个异常. endl;/这里抛出一个异常(其中异常对象的数据类型是char*)char* p=0;throw p;/catch( char* value )/注意这里catch语句catch( )cout 在 catch() block 中, char*类型的异常对象也被处理 endl;int main()trycout 在 try block 中, 准备抛出一个异常. endl;/这里抛出一个异常(其中异常对象的数据类型是int)int a4;throw a;/catch( int value )/注意这里catch语句catch( )cout 在 catch() block

34、中, int类型的异常对象也被处理 endl;4、对于抽象数据类型的异常对象。catch()同样有效,例程如下:class MyExceptionpublic:protected:int code;int main()trycout 在 try block 中, 准备抛出一个异常. endl;/这里抛出一个异常(其中异常对象的数据类型是MyException)throw MyException();/catch(MyException& value )/注意这里catch语句catch( )cout 在catch() block中, MyException类型的异常对象被处理 endl;对ca

35、tch()有点迷糊?1、究竟对catch()有什么迷糊呢?还是看例子先吧!void main()int* p = 0;try/ 注意:下面这条语句虽然不是throw语句,但它在执行时会导致系统/ 出现一个存储保护错误的异常(access violation exception)*p = 13; / causes an access violation exception;catch(.)/catch()能抓获住上面的access violation exception异常吗?cout 在catch() block中 endl;请问上面的程序运行时会出现什么结果吗?catch()能抓获住系统中出

36、现的access violation exception异常吗?朋友们!和我们的主人公阿愚一样,自己动手去测试一把!结果又如何呢?实际上它有两种不同的运行结果,在window2000系统下用VC来测试运行这个小程序时,发现程序能输出在catch() block中的语句在屏幕上,也即catch() 能成功抓获住系统中出现的access violation exception异常,很厉害吧!但如果这个同样的程序在linux下用gcc编译后运行时,程序将会出现崩溃,并在屏幕上输出”segment fault”的错误信息。主人公阿愚有点急了,也开始有点迷糊了,为什么?为什么?为什么同样一个程序在两种不

37、同的系统上有不同的表现呢?其原因就是:对于这种由于硬件或操作系统出现的系统异常(例如说被零除、内存存储控制异常、页错误等等)时,window2000系统有一个叫做结构化异常处理(Structured Exception Handling,SEH)的机制,这个东东太厉害了,它能和VC中的C+异常处理模型很好的结合上(实际上VC实现的C+异常处理模型很大程度上建立在SEH机制之上的,或者说它是SEH的扩展,后面文章中会详细阐述并分析这个久富盛名的SEH,看看catch()是如何神奇接管住这种系统异常出现后的程序控制流的,不过这都是后话)。而在linux系统下,系统异常是由信号处理编程方法来控制的(

38、信号处理编程,signal processing progamming。在介绍unix和linux下如何编程的书籍中,都会有对信号处理编程详细的介绍,当然执著的主人公阿愚肯定对它也不会放过,会深入到unix沿袭下来的信号处理编程内部的实现机制,并尝试完善改进它,使它也能够较好地和C+异常处理模型结合上)。那么C+标准中对于这种同一个程序有不同的运行结果有何解释呢?这里需要注意的是,window2000系统下catch()能捕获住系统异常,这完全是它自己的扩展。在C+标准中并没有要求到这一点,它只规定catch()必须能捕获程序中所有通过throw语句抛出的异常。因此上面的这个程序在linux系

39、统下的运行结果也完全是符合C+标准的。虽然大家也必须承认window2000系统下对C+异常处理模型的这种扩展确实是一个很不错的完善,极大得提高了程序的安全性。为什么要用catch()这个东东?程序员朋友们也许会说,这还有问吗?这篇文章的一开始不就讲到了吗?catch()能够捕获多种数据类型的异常对象,所以它提供给程序员一种对异常对象更好的控制手段,使开发的软件系统有很好的可靠性。因此一个比较有经验的程序员通常会这样组织编写它的代码模块,如下:void Func()try/ 这里的程序代码完成真正复杂的计算工作,这些代码在执行过程中/ 有可能抛出DataType1、DataType2和Data

40、Type3类型的异常对象。catch(DataType1& d1)catch(DataType2& d2)catch(DataType3& d3)/ 注意上面try block中可能抛出的DataType1、DataType2和DataType3三/ 种类型的异常对象在前面都已经有对应的catch block来处理。但为什么/ 还要在最后再定义一个catch() block呢?这就是为了有更好的安全性和/ 可靠性,避免上面的try block抛出了其它未考虑到的异常对象时导致的程/ 序出现意外崩溃的严重后果,而且这在用VC开发的系统上更特别有效,因/ 为catch()能捕获系统出现的异常,而系

41、统异常往往令程序员头痛了,现/ 在系统一般都比较复杂,而且由很多人共同开发,一不小心就会导致一个/ 指针变量指向了其它非法区域,结果意外灾难不幸发生了。catch()为这种/ 潜在的隐患提供了一种有效的补救措施。catch() 还有,特别是VC程序员为了使开发的系统有更好的可靠性,往往在应用程序的入口函数中(如MFC框架的开发环境下CXXXApp:InitInstance())和工作线程的入口函数中加上一个顶层的trycatch块,并且使用catch()来捕获一切所有的异常,如下:BOOL CXXXApp:InitInstance()if (!AfxSocketInit()AfxMessage

42、Box(IDP_SOCKETS_INIT_FAILED);return FALSE;AfxEnableControlContainer();/ Standard initialization/ If you are not using these features and wish to reduce the size/ of your final executable, you should remove from the following/ the specific initialization routines you do not need.#ifdef _AFXDLLEnable3dControls(); / Call this when using MFC in a shared DLL#elseEnable3dControlsStatic(); / Call this wh

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 建筑/施工/环境 > 农业报告


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号