第9章 编译预处和动态存储分配.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第9章 编译预处和动态存储分配

第九章 编译预处理和动态存储分配 考核知识点宏定义、不带参数的宏定义、带参数的宏定义 文件包含 动态存储分配 重要考点提示 理解并会使用宏定义 使用常用函数的“文件包含” 9.1宏定义 1.不带参数的宏定义 不带参数的宏定义命令行形式如下: #define 宏名 替换文本 或#define 宏名 在define宏名和宏替换文本之间要用空格隔开。 说明:宏名一般习惯用大写字母表示,宏替换的过程实质上是原样替换的过程。宏定义可以差事少程序中重复办公室某些字符串的工作量。 注意:可以用#undef命令终止宏定义的作用域。 例如: #define PI 3.14 main() { } #undef PI 在进行宏定义时,可以引用已定义的宏名,例如: #define R 15.5 #define PI 3.14 #define L 2*PI*R 2.带参数的宏定义 定义的一般形式为: #define 宏名(参数表) 字符串 宏定义不只进行简单的字符串替换,还要进行参数替换,例如: #define MV(x,y)((x)*(y)) ... a=MV(5,2);/*引用带参的宠名*/ b=6MV(a+3,a); 以上宏定义命令行中,MV(x,y)称为“宏”,其中MV是一个用户标识符,称为宏名。宏名和左括号“(”必须紧挨着,它们之间不能留有空格,其后圆括号中由称为形参的标识符组成,并且可以有多个形参,各参数之间用逗号隔开,“替换文本”中通常应该包含有形参。 执行过程:如果程序中有带实参的宏,则按#define便衣行中指定的字符串从左到右进行了置换。如果字符串中包含宏中的形参(如x,y),则将程序语句中相应的实参(可以是常量、变量或表达式)代替形参。如果宏定义中的字符串中的字符不是参数字符(如(x*y)中的“*”号),则保留。这样就形成了置换的字符串。 提示:和不带参数的宏定义相同,同一个宏名不能重复定义。在替换带参数的宏名时,圆括号必不可少。 带参数的宏和函数之间有一定类似之处,在引用函数时也是在函数右面的括号写实参,也要求实参与形参数目相等,但两者是不同的,主要表现在: ⑴函数调用时,要求实参、形参类型相匹配,但在宏替换中,对参数没有类型的要求。 ⑵函数调用时,先求出实参表达式的值,然后代入形参,而使用带参数的宏只是进行简单的字符串替换。 ⑶函数调用是在程序运行时处理的,要分配临时的内存单元,还要占用一系列的处理时间。宏替换在编译预处理时完成,因此,宏替换不占运行时间,不被分配内存单元,不进行值的传递,也没有“返回值”的概念。 ⑷使用宏的次数较多时,宏展开后源程序变长,而函数调用不会。 9.2文件包含 1.文件包含 所谓文件包含,是指在一个文件中包含另一个文件的全部内容。C语言用#define命令行来实现文件包含的功能。形式如下: # include “文件名”或# include 文件名 在预编译时,预编译程序将用指定文件中的内容来替换此命令行。如果文件名用双引号括起来,则系统先在当前源程序所在的目录内查找指定的包含文件,如果找不到,再按照系统指定的标准方式到有关目录中去寻找。如果文件名用尖括号括起来,系统将直接按照系统指定的标准方式到有关目录中去寻找。 说明: ⑴# include命令行通常书写在所用文件的最开始部分,所以有时也把包含文件称做“头文件”。头文件名可由用户指定,其后缀不一定用”.h”。 ⑵当包含文件被修改后,对包含该文件的源程序必须重新进行编译连接,这样才会使修改后的文件生效。 ⑶在一个包含文件中还可以包含另外的文件。 ⑷在一个程序中可以有多个#include命令行。 9.3条件编译 1.条件编译 在一般情况下,源程序中所有的行都参加编译(注释行除外),但是有时希望其中一部分语句只有在满足某些条件时才进行编译。也就是说要为一部分语句指定编译的条件,如果编译条件成立,就对这部分语句进行编译,这就是“条件编译”。有时,希望当满足某条件时对一组语句进行了编译,而当不满足时则编译另一组语句,条件编译有以下3种形式: ⑴#if表达式 程序段1 #else 程序段2 #endif 它的作用是当指定的表达式值为真(非零)时就编译程序段1,否则编译程序段2。可以事先给定一定条件,使程序在不同的条件下执行不同的功能。 ⑵#indef 标识符 程序段1 #else 程序段2 #endif 它的作用是当指定的樯符已经被#define命令定义过,则在程序编译阶段只编译程序段1,否则编译程序段2,其中#else部分可以没有。可以参考if语句来理解。 ⑶#ifdef 标识符 程序段1 #else 程序段2 #endif 它的作用是若标识符未被定义过,则编译程序段1,否则编译程序段2。 9.4关于动态存储的函

文档评论(0)

whemm + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档