计算机二级C语言辅导 13章.ppt_第1页
计算机二级C语言辅导 13章.ppt_第2页
计算机二级C语言辅导 13章.ppt_第3页
计算机二级C语言辅导 13章.ppt_第4页
计算机二级C语言辅导 13章.ppt_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第13章 编译预处理和动态分配 编译预处理 目的 为了简化程序的编写 提高程序的可移植性 可读性 模块化 C语言设计了若干命令 编译预处理命令 并可出现于程序当中 作用 对源程序编译之前做一些处理 生成扩展C源程序 1 宏定义命令 define 有三种类型的预处理命令 2 文件包含命令 include 3 条件编译命令 if else endif 编译 C编译系统对源程序进行 词法和语法分析 代码生成 优化 OBJ文件 编译预处理 编译前对源程序进行一些预加工 改善程序设计环境 模块化设计 格式 开头占单独书写行语句尾不加分号可出现在程序的任何位置作用范围 出现点至所在源程序未尾 为了与C语句区别 这些命令均以 开头 处理流程 第一次编译扫描时 将预编译命令处理完 然后再进行正式编译 生成目标代码 宏替换分为 无参数和有参数二种形式 一 无参形式 一般形式 define宏名替换文本功能 宏替换是用宏名来表示一个替换文本 在宏展开时又以该替换文本取代宏名 只是一种简单的代换 说明 1 define 宏名 替换文本之间用空格隔开2 宏替换必须写在函数之外 3 作用域 其作用域为从宏替换起到源程序结束 4 在行末不加分号 如 defineN10 注意后面没有分号 即 把程序中的N替换成10 而不是N的值等于10 N不是变量 它是常量 在程序正式运行之前进行替换 宏展开 预编译时 用替换文本替换宏名 不作语法检查宏定义中使用必要的括号 例 defineA80 defineB A 40 m B 2 宏展开 m 80 40 2 undef可终止宏名作用域格式 undef宏名 m 80 40 2 说明 宏名一般用大写字母 这不是语法规定 只是一种习惯 可以使用宏名代替一个字符串 当宏定义在一行中写不下 需要在下一行继续时 只需在最后一个字符后紧接一个反斜线 例如 defineYEARyear 4 0 year 100 0 year 400 0注意在第二行开始不要有空格 否则空格会一起被替换 宏名的有效范围为定义命令之后到本源文件结束 除非用 undef命令终止宏名的作用域 对程序中用双引号括起来的字符串内的子串和用户标识符中的成分不做替换 同一个宏名不能重复定义 一般形式 define宏名 参数表 替换文本 例 defineS r PI r r相当于定义了不带参宏S 代表字符串 r PI r r 宏展开 形参用实参换 其它字符保留替换文本及各形参外一般应加括号 例 defineS a b a b area S 3 2 宏展开 area 3 2 不能加空格 例 definePOWER x x xx 4 y 6 z POWER x y 宏展开 z x y x y 一般写成 definePOWER x x x 宏展开 z x y x y 二 有参形式 例 defineF x 3 x 5main printf d 2 F 3 6 答案 2 3 x 5 2 3 3 6 5 29 如果改成 defineF x 3 x 5main printf d 2 F 3 6 答案 2 3 x 5 2 3 3 6 5 59 宏展开 t a b c d a b c d 题 35 有以下程序 include defineSUB a a a main inta 2 b 3 c 5 d d SUB a b c printf d n d 程序运行后的输出结果是 A 0B 12C 20D 10 d a b a b c 5 5 5 20 注意几点 1 宏替换中 宏名和形参表之间不能有空格出现 例如 defineMAX a b a b a b将被认为宏名MAX代表的字符串是 a b a b a b 是无参宏定义 2 在带参宏替换中 形式参数不同于函数中的形参 带参宏替换中的参数不是变量 只是在宏调用时用实参的符号去代换形参 即只是符号代换 所以 不存在值传递的问题 3 在宏替换中的形参是标识符 而宏调用中的实参可以是表达式 4 在宏替换中的形参最好用括号括起来 以避免出错 13 2文件包含 C语言允许在一个文件预编译时 将另一个文件原封不动地包含进来 目的 当函数不在一个文件中 既可用link连接编译后的obj文件 也可用 文件包含 方式 当一组符号常量的定义为公用时 可作为一个独立的文件被其它文件包含 文件包含功能 一个源文件可将另一个源文件的内容全部包含进来一般形式 include 文件名 或 include处理过程 预编译时 用被包含文件的内容取代该预处理命令 再对 包含 后的文件作一个源文件编译 直接按标准目录搜索 先在当前目录搜索 再搜索标准目录可指定路径 被包含文件内容 源文件 c 头文件 h 文件包含可嵌套 宏定义数据结构定义函数说明等 一个include只能写一个文件 包含多个文件需多个include 当f1 c包含f2 c 而f2 c又包含f3 c时 有两种包含形式 只在f1 c中用 include include f2 c include f3 c 分别在f1 c f2 c中用 include在f1 c中 include f2 c 在f2 c中 include f3 c 3 一般用 h和 c扩展名命名被包含文件 h为head之意 4 include后的文件名既可用 也可用 两者区别 首先在当前目录中找 然后再去标准目录中找 只在标准目录 include目录 中找 说明 条件编译 一般情况下 源程序中的所有行都参加编译 但特殊情况下可能需要根据不同的条件编译源程序中的不同部分 也就是说对源程序的一部分内容给定一定的编译条件 这种方式称作 条件编译 有时 C程序的一部分语句是否起作用要根据一定的条件 即由条件而决定是否起作用 13 3条件编译 例如 调试程序时 需加多条printf 但调试完则要一一删除 有的语句也视条件而决定其具体形式 形式1 ifdef标识符程序段1 else程序段2 endif 条件编译命令的三种形式 形式2 ifndef标识符程序段1 else程序段2 endif 形式3 if表达式程序段1 else程序段2 endif 形式1功能 当标识符在此之前被定义过 即用 define定义过 则编译程序段1 否则编译程序段2 其中 程序段即可为语句组 也可为命令行 例 为了调试程序 加上以下条件编译 ifdefDEBUGprintf x d y d z d x y z endif 另 else后面部分可没有 但 endif保留 只要在此之前有 defineDEBUG则编译printf x d y d z d x y z 例 exp11 5 c include defineENprintf Pleaseinputnumber n main inta 123 b 456 ifdefEN prinft Thisistest a d n a else prinft Thisistest b d n b endif 运行结果 Thisistest a 123 形式2 ifndef标识符程序段1 else程序段2 endif 功能 与形式1的条件正好相反 即 当标识符未被定义 则编译程序段1 否则编译程序段2 例 exp11 5 c include defineENprintf Pleaseinputnumber n main inta 123 b 456 ifndefEN prinft Thisistest a d n a else prinft Thisistest b d n b endif 运行结果 Thisistest b 456 形式3 if表达式程序段1 else程序段2 endif 功能 当表达式 0 则编译程序段1 否则编译程序段2 内存分配函数 1 动态内存分配 的概念使用户程序能在运行期间动态地申请和释放内存空间 从而更有效地利用内存并提高程序设计的灵活性 如 为了保证程序的通用性 最大需要建立一个1000个元素的字符数组 每个数组元素占30个字符 共需30000个字节存储空间 但程序某次运行时 可能只使用30个数组元素 于是就有29100个字节的已分配存储空间被浪费 此时 可通过动态内存分配技术 将程序设计成运行时才向计算机申请内存 并在用完时立即释放占用的内存空间 使用动态内存分配技术建立的链表称为 动态链表 2 动态内存分配函数 以下函数在malloc h或stdlib h中定义 void malloc x 分配一个长度为x字节的连续空间 分配成功返回起始地址指针 分配失败 内存不足 返回NULLvoid calloc n x

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论