- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第4章 函数与预处理05
4.10.2 宏定义 说明: 宏名或符号常量一般习惯用大写字母,以便与变量名区别,但也可以使用小写字母。 在做宏定义时,可以引用已定义的宏名,构成嵌套引用的宏定义。 宏代换只做简单的置换,不作正确性检查。如果所定义的字符串中有语法错误,如将数字2误写为字母z,预处理时照样代换,只有当编译时进行语法检查才会发现错误并报错。 4.10.2 宏定义 2. 带参宏定义 C语言允许宏带有参数。在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数。对带有参数的宏,预处理时,先用实参替代形参字符串,再将宏展开。 带参宏定义的一般形式为: #define 宏名(形参表) 字符串 形参表中包含一个或多个参数,参数间用逗号分隔。 由表达式或语句组成,其中包含形参表中指定的参数。 4.10.2 宏定义 带参宏调用的一般形式为: 宏名(实参表) 实参可以是常量、变量或表达式。 例如: #define MUL(x,y) ((x)*(y)) 宏调用: s=MUL(3,5); 宏展开后得到: s=((3)*(5)); 4.10.2 宏定义 例如: #define MUL(x,y) x*y 宏调用: s=MUL(3+a,5+b); 宏展开后得到: s=3+a*5+b; 对带参数的宏展开只是将语句中的宏名后面括号内的实参字符串代替#define 命令行中的形参。 只替换,不能自行加括号。 【例4.23】输入正方形的边长,求它的面积和体积。 #includestdio.h #includemath.h #define SQR(A,S,V) S=A*A; V=pow(A,3); void main() { double a,m,n; printf(please input side length: ); scanf(%lf,a); SQR(a,m,n); printf(Area is %.3lf\n, m); printf(Volume is %.3lf\n, n); } 带参宏定义 宏展开为: m=a*a;n=pow(a,3); 4.10.2 宏定义 说明: 在带参宏定义中,形式参数不分配内存单元,因此不必作类型说明。 在宏定义时,宏名和其后的参数之间不能有空格,否则预处理时会认为该宏为无参宏,而将空格后的所有字符当做替换字符串。 无论是带参还是不带的宏定义,作用域都是从宏定义命令开始到源文件结束。如果需要终止宏定义,可以使用#undef命令,则作用域改为从定义处到#undef处。 4.10.2 宏定义 带参数的宏和函数的区别: (1) 函数调用时,先求出实参表达式的值,然后代入形参。而使用带参的宏只是进行简单的字符替换。 (2) 函数调用是在程序运行时处理的,而宏展开则是在编译前进行的。 (3) 对函数中的实参和形参类型要求一致。而宏名无类型,它的参数也无类型,只是一个符号代表,展开时代入指定的字符串即可。 (4) 使用宏次数多时,宏展开后源程序长,因为每展开一次都使程序增长,而函数调用不会使源程序变长。 (6) 宏替换不占运行时间,只占编译时间。而函数调用则占运行时间。 4.10.3 条件编译 条件编译:是对部分内容指定编译的条件,使其只在满足一定条件才进行编译。 条件编译命令的几种形式: (1)#ifdef 标识符 程序段1 #else 程序段2 #endif (2)#ifndef 标识符 程序段1 #else 程序段2 #endif 4.10.3 条件编译 (3)#if 常量表达式 程序段1 #else 程序段2 #endif (4)#if 常量表达式1 程序段1 #elif 常量表达式2 程序段2 #else 程序段 3 #endif 条件编译也可以用条件语句来代替,但是用条件语句将会对整个源程序进行编译,生成的目标代码文件可能会很长,而采用条件编译时,编译器会根据条件选择一些程序段来编译,生成的目标代码文件相对就较短。 4.11 案例应用 在案例“学生成绩管理系统”的设计中,采用了结构化程序设计的方法将该系统分解为九个子模块,然后可对这些子模块分别进行函数设计。 输入函数 输出函数 查找函数 修改函数 插入函数 删除函数 成绩统计函数 排序函数 添加函数 menu函数 void menu() { char choice; …… /*此处显示应用程序的界面*/ choice=getchar();getchar(); //用户输入选择 switch(choice)
文档评论(0)