第9章--编译预处理和动态存储分配.doc

第9章--编译预处理和动态存储分配.doc

ID:59335741

大小:57.00 KB

页数:9页

时间:2020-09-04

第9章--编译预处理和动态存储分配.doc_第1页
第9章--编译预处理和动态存储分配.doc_第2页
第9章--编译预处理和动态存储分配.doc_第3页
第9章--编译预处理和动态存储分配.doc_第4页
第9章--编译预处理和动态存储分配.doc_第5页
资源描述:

《第9章--编译预处理和动态存储分配.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、第九章编译预处理和动态存储分配●考核知识点宏定义、不带参数的宏定义、带参数的宏定义●文件包含●动态存储分配重要考点提示●理解并会使用宏定义●使用常用函数的“文件包含”9.1宏定义1.不带参数的宏定义不带参数的宏定义命令行形式如下:#define宏名替换文本或#define宏名在define宏名和宏替换文本之间要用空格隔开。说明:宏名一般习惯用大写字母表示,宏替换的过程实质上是原样替换的过程。宏定义可以差事少程序中重复办公室某些字符串的工作量。注意:可以用#undef命令终止宏定义的作用域。例如:#definePI3.14main()PI的作用域{}#undefPI在进行

2、宏定义时,可以引用已定义的宏名,例如:#defineR15.5#definePI3.14#defineL2*PI*R2.带参数的宏定义定义的一般形式为:#define宏名(参数表)字符串宏定义不只进行简单的字符串替换,还要进行参数替换,例如:#defineMV(x,y)((x)*(y))...a=MV(5,2);/*引用带参的宠名*/b=6MV(a+3,a);以上宏定义命令行中,MV(x,y)称为“宏”,其中MV是一个用户标识符,称为宏名。宏名和左括号“(”必须紧挨着,它们之间不能留有空格,其后圆括号中由称为形参的标识符组成,并且可以有多个形参,各参数之间用逗号隔开,“

3、替换文本”中通常应该包含有形参。执行过程:如果程序中有带实参的宏,则按#define便衣行中指定的字符串从左到右进行了置换。如果字符串中包含宏中的形参(如x,y),则将程序语句中相应的实参(可以是常量、变量或表达式)代替形参。如果宏定义中的字符串中的字符不是参数字符(如(x*y)中的“*”号),则保留。这样就形成了置换的字符串。提示:和不带参数的宏定义相同,同一个宏名不能重复定义。在替换带参数的宏名时,圆括号必不可少。带参数的宏和函数之间有一定类似之处,在引用函数时也是在函数右面的括号写实参,也要求实参与形参数目相等,但两者是不同的,主要表现在:⑴函数调用时,要求实参、

4、形参类型相匹配,但在宏替换中,对参数没有类型的要求。⑵函数调用时,先求出实参表达式的值,然后代入形参,而使用带参数的宏只是进行简单的字符串替换。⑶函数调用是在程序运行时处理的,要分配临时的内存单元,还要占用一系列的处理时间。宏替换在编译预处理时完成,因此,宏替换不占运行时间,不被分配内存单元,不进行值的传递,也没有“返回值”的概念。⑷使用宏的次数较多时,宏展开后源程序变长,而函数调用不会。9.2文件包含1.文件包含所谓文件包含,是指在一个文件中包含另一个文件的全部内容。C语言用#define命令行来实现文件包含的功能。形式如下:#include“文件名”或#includ

5、e<文件名>在预编译时,预编译程序将用指定文件中的内容来替换此命令行。如果文件名用双引号括起来,则系统先在当前源程序所在的目录内查找指定的包含文件,如果找不到,再按照系统指定的标准方式到有关目录中去寻找。如果文件名用尖括号括起来,系统将直接按照系统指定的标准方式到有关目录中去寻找。说明:⑴#include命令行通常书写在所用文件的最开始部分,所以有时也把包含文件称做“头文件”。头文件名可由用户指定,其后缀不一定用”.h”。⑵当包含文件被修改后,对包含该文件的源程序必须重新进行编译连接,这样才会使修改后的文件生效。⑶在一个包含文件中还可以包含另外的文件。⑷在一个程序中可以

6、有多个#include命令行。9.3条件编译1.条件编译在一般情况下,源程序中所有的行都参加编译(注释行除外),但是有时希望其中一部分语句只有在满足某些条件时才进行编译。也就是说要为一部分语句指定编译的条件,如果编译条件成立,就对这部分语句进行编译,这就是“条件编译”。有时,希望当满足某条件时对一组语句进行了编译,而当不满足时则编译另一组语句,条件编译有以下3种形式:⑴#if表达式程序段1#else程序段2#endif它的作用是当指定的表达式值为真(非零)时就编译程序段1,否则编译程序段2。可以事先给定一定条件,使程序在不同的条件下执行不同的功能。⑵#indef标识符程

7、序段1#else程序段2#endif它的作用是当指定的樯符已经被#define命令定义过,则在程序编译阶段只编译程序段1,否则编译程序段2,其中#else部分可以没有。可以参考if语句来理解。⑶#ifdef标识符程序段1#else程序段2#endif它的作用是若标识符未被定义过,则编译程序段1,否则编译程序段2。9.4关于动态存储的函数我们知道,构成链表结构的每一个节点,是在需要时由系统自动分配存储的,即在需要时才开辟一个节点的存储单元。C语言编译系统是如何动态地开辟和释放存储单元呢?在C语言的库函数中有以下有关函数。1.malloc()

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。