第五章函数.ppt

  1. 1、本文档共114页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
编写模块的技术 模块的信息隐藏 用static定义的函数和全局变量只在此模块内有效(建议采用) 允许被其它模块使用的全局变量 在源文件中定义,不加static修饰 在头文件中进行声明,加extern修饰 * 模块化程序设计方法 功能分解 自顶向下、逐步求精的过程 模块分解的原则 保证模块的相对独立性 高聚合、低耦合 模块的实现细节对外不可见 外部:关心做什么 内部:关心怎么做 设计好模块接口 接口是指罗列出一个模块的所有的与外部打交道的变量等 定义好后不要轻易改动 在模块开头(文件的开头)进行函数声明 *函数设计的原则 函数的功能要单一,不要设计多用途的函数 函数的规模要小,尽量控制在50行代码以内 1986年IBM在OS/360的研究结果:大多数有错误的函数都大于500行 1991年对148,000行代码的研究表明:小于143行的函数比更长的函数更容易维护 参数和返回值的规则 参数要书写完整,不要省略 对函数的入口参数进行有效性检查 没有参数和返回值时,用void填充 每个函数只有一个入口和一个出口,尽量不使用全局变量 尽量少用静态局部变量,以避免使函数具有“记忆”功能 模块和链接 将一个程序分解成若干个模块,分别放在几个源文件中,形成一个项目文件(.prj )(Project) 然后,对每一个源文件(.c)分别单独进行编译 再将它们的目标代码(.obj )连同标准函数库中的函数链接在一起,形成可执行文件(.exe)。 模块之间通过互相调用函数联系起来 头文件(.h)是联系的纽带 模块和链接 优点: 当一个文件的代码被修改后,不必对所有程序重新编译,从而节省了程序的编译时间。 使程序更宜于维护,给多个程序员共同编制一个大型项目的代码提供了方便手段。 模块和链接 例5.10可以不看 将习题5.5修改成 1个.h头文件(X5-5-1.h) 2个.c源文件(X5-5-1.c,X5-5.c) 1个.prj项目文件(X5-5.prj) 由所有源程序文件组成 X5-5-1.C X5-5.C 参见实验指导书第133页 编译器在开始正式编译之前处理的指令,叫预编译指令 它们不会存在于最后生成的目标代码中 文件包含:#include 用#include指定的文件内容替换#include所在的行 用或者括上文件名 表示在编译器的include目录内查找文件 表示在当前目录查找文件 文件名中可以带有路径 预编译指令 #define #define 宏名字 替换文本 在#define之后,所有独立出现“宏名字”的地方(除了字符串内)都被“替换文本”替换 “替换文本”中可以有空格 宏可以有参数 #define max(A,B) ((A) (B) ? (A) : (B)) 能想出带参数的宏和函数的区别吗? 定义宏的时候注意替换发生后产生的非预想结果 一般用括号可以避免,如上例 宏名中间不要有空格 与#define配套者 #undef,从现在开始取消#define的定义 #undef MAXLINE #if, #else,#elif,#endif #ifdef,#ifndef 这些预编译指令通常用来处理多文件工程和程序多版本的问题。(程序多版本一般是不同平台的版本,不同用户等级的版本,不同开发阶段的版本等) 增强程序可读性 但是调错时宏可能带来很多难题 精简源代码,提取变化 这一点更多时候用函数的效果更好,但宏也有其不可替代的优势 不编译无用代码,精炼目标代码 使用预编译指令的目的 函数的定义、调用 变量的作用域、存储类 自动变量(auto) 外部变量(extern) 静态变量(static) 寄存器变量(register) 程序调试方法 这一章我们学习了 作业 P180,习题5.1~5.5 六、宏定义 语法形式:#define 宏名(参数表) 字符串 形式参数 作用:在程序中用字符串代替宏名,同时用 实际参数代替形式参数 例:#define s(a,b) a*b …….. m=s(3,4); / m=3*4 说明: c语言中的编译预处理对宏的处理仅仅是作简单的替换。 例:定义计算平方值的宏为 #define square(n) ((n)*(n)) √ 若写成:#define square(n) ( n * n ) × 若写成:#define square(n) ( n) *( n ) × 因为若程序中有语句 s=square(3+5) 则,以实参3+5替换形参n,变成:s=square(3+5*3+5) 因为若程序中有语句 printf(“

文档评论(0)

1112111 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档