还剩3页未读,继续阅读
文本内容:
第章编译预处理命令11第一单元学习指南本章教学目标
1.掌握如何在程序中正确地使用宏定义命令与文件包含命令学习方法建议
1.仔细阅读本章示例程序,正确理解每条语句的功能2,上机调试运行本章示例程序,并调试运行自己编写的程序,进一步体会宏定义命令与文件包含命令的作用
4.对于语法错误,采取与前面相同的应对措施
5.对于逻辑错误,着重检查是否在宏定义命令之后误加分号以及在宏名与替换文本之间误加o仍然可以采用在程序中添加临时性输出语句的方法,进行出错位置的定位
6.记录总结在调试程序的过程中发现的错误以及改正的方法第二单元重点与难点解析
1.编译预处理到底是什么意思?有什么用处?【解析】编译预处理是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所作的工作预处理指令指示在程序正式编译前就由编译器进行的操作,可放在程序中任何位置预处理是C语言的一个重要功能,它由预处理程序即预处理器负责完成当对一个源文件进行编译时,系统将自动引用预处理程序对源程序中的预处理部分作处理,处理完毕自动进入对源程序的编译C语言提供多种预处理功能,主要处理#开始的预编译指令,如宏定义#€161区、文件包含《include、条件编译#ifdef等合理使用预处理功能编写的程序便于阅读、修改、移植和调试,也有利于模块化程序设计
2.使用无参宏有什么注意事项?【解析】使用无参宏时注意事项如下1宏名一般用大写字母表示,以便于与变量区别如#define PI
3.14159262宏定义末尾不必加分号,否则连分号一并替换3宏定义可以嵌套#define PI
3.1415926#define R5ttdefine SPI*R*R〃嵌套定义4可用#undef命令终止宏定义的作用域5使用宏可提高程序通用性和易读性,减少不一致性,减少输入错误和便于修改如数组大小常用宏定义ttdefine N100int mainvoid{int a[N];〃定义数组a,使用了宏N定义数组a的大小6预处理是在编译之前的处理,而编译工作的任务之一就是语法检查,预处理不做语法检查7宏定义写在函数的花括号外边,作用域为其后的程序,通常在文件的最开头8在程序中宏名不要出现在字符串〃〃中,否则该宏名当字符串处理9宏定义不分配内存,变量定义分配内存
3.带参宏使用时有什么注意事项?【解析】带参宏使用时注意事项如下1宏名和形参表的括号间不能有空格2宏替换只作替换,不做计算,不做表达式求解3宏的形参、实参不存在类型,参数传递时也不进行类型转换
4.带参宏与函数调用有什么区别?【解析】二者区别如下1函数调用在编译后程序运行时进行,并且分配内存宏替换在编译前进行,不分配内存2函数只有一个返回值,利用宏则可以设法得到多个值3宏展开使源程序变长,函数调用不会4宏展开不占用运行时间,只占编译时间,函数调用占运行时间分配内存、保留现场、值传递、返回值5为防止无限制递归展开,当宏调用自身时,不再继续展开如#define TESTxx+TESTx被展开为1+TEST lo
5.宏的定义可以取消吗?【解析】可以,宏定义必须写在函数外,其作用域为宏定义起到源程序结束如要终止其作用域可使用#皿10£命令,如下所示ttdefine PI
3.1415926〃定义宏ttundef PI〃取消宏
6.宏定义典型示例【解析】1求最大值^define MAXx,y xyx:y2求最小值ftdefine MINx,y xyx:y3将一个字母转换为大写ftdefine UPCASEc c〉=ac二zc+A-a:c4将一个字母转换为小写ftdefine LOCASEcc=Ac〈=Zc+a-A:c5判断字符是不是10进制的数字ftdefine ISDECcc=Oc=96判断字符是不是16进制的数字ftdefine ISHEXcc=O c〈=9||c〉=A c=F||c=ac=f7返回数组元素的个数#define ARRSIZEarr sizeofarr/sizeofarr
[0]【提示】sizeofarr返回数组arr所占的总字节数
7.本章内容小结【解析】I预处理功能是c语言特有的功能,它是在对源程序正式编译前由预处理程序完成的程序员在程序中用预处理命令来调用这些功能2宏定义是用一个标识符来表示一个字符串,这个字符串可以是常量、变量或表达式在宏调用中将用该字符串代换宏名3宏定义可以带有参数,宏调用时是以实参代换形参而不是“值传递”4为了避免宏替换时发生错误,宏定义中的字符串应加括号,字符串中出现的形式参数两边也应加括号5文件包含是预处理的一个重要功能,它可用来把多个源文件连接成一个源文件进行编译,结果将生成一个目标文件6条件编译允许只编译源程序中满足条件的程序段,使生成的目标程序较短,从而减少了内存的开销并提高了程序的效率7使用预处理功能便于程序的修改、阅读、移植和调试,也便于实现模块化程序设计第三单元典型错误解析
1.宏定义命令中误用“二”宏定义命令中宏名与替换文本之间,要用空格符分隔,而不是用赋值运算符连接起来例如#define PI=
3.14159是错误的正确的写法应该是#define PI
3.
141592.宏定义命令末尾误用分号因为宏定义命令不属于C语言的语句,故行末不应添加分号否则会将该分号看做是替换文本的一部分例如#define PI
3.14159;是错误的,行末分号多余正确的写法应该是#define PI
3.
141593.宏定义展开错误宏定义展开时,只能进行严格的替换,而不能随意添加括号例如#define T9#define NT+l#define M2*N main%,{printf d\n”M;}则M的展开式为2*N-2*T+1-2*9+1而不能展开为2*N-2*T+lf2*9+1因此,在进行宏定义时,应将非单项的替换文本用圆括号括起来例如#define T9#define NT+l#define M2*N main{printfH%d\nn M;}z则M的展开式为2*N-2*T+lf2*9+l此时,替换结果与我们的一般预期一致
4.带参数宏定义展开错误带参数宏定义展开时,只能进行严格的替换,而不能随意添加括号例如#define Mx,y x*y main{printfn%d\nn,M3+6,6+3;则M的展开式为M3+6,6+3TX*y-3+6*6+3-42而不能展开为M3+6,6+3-x*y-3+6*6+3f81因此,在进行带参数宏定义时,应将整个替换文本以及每个参数用圆括号括起来例如o#define Mx,y x*y main{printfn%d\nn,M3+6,6+3;则M的展开式为M3+6,6+3fx*yf3+6*6+3f81此时,替换结果与我们的一般预期一致
5.文件包含命令错误每个include命令只能包含一个头文件,而不能同时包含多个头文件例如#include stdio.h,math.h是错误的正确的写法应该是♦include stdio.h#include math.h。
个人认证
优秀文档
获得点赞 0