《C语言程序设计》课件-第8章 编译预处理_第1页
《C语言程序设计》课件-第8章 编译预处理_第2页
《C语言程序设计》课件-第8章 编译预处理_第3页
《C语言程序设计》课件-第8章 编译预处理_第4页
《C语言程序设计》课件-第8章 编译预处理_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

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

文档简介

8.1宏定义第8章编译预处理思政目标1、遵循宏定义规则宏定义需严格遵循格式要求,如符号使用、参数设置等。学生通过学习,养成严谨书写代码习惯,明白细节决定成败,增强规则意识。2、促进团队资源共享文件包含可实现代码复用,类似团队成员共享资源。学生体会到合作优势,培养合作意识,明白团队协作可提高效率、减少重复劳动。8.1宏定义第8章编译预处理作用:对源程序编译之前做一些处理,生成扩展C源程序种类宏定义#define文件包含#include条件编译#if--#else--#endif等格式:“#”开头占单独书写行语句尾不加分号如if(x==YES)printf(“correct!\n”);elseif(x==NO)printf(“error!\n”);展开后:if(x==1)printf(“correct!\n”);elseif(x==0)printf(“error!\n”);8.1

宏定义不带参数宏定义一般形式:#define宏名[宏体]功能:用指定标识符(宏名)代替字符序列(宏体)宏展开:预编译时,用宏体替换宏名---不作语法检查如#defineYES1#defineNO0#definePI3.1415926#defineOUTprintf(“Hello,World”);宏体可缺省,表示宏名定义过或取消宏体定义位置:任意(一般在函数外面)作用域:从定义命令到文件结束#undef可终止宏名作用域格式:

#undef宏名例#defineYES1main(){……..}#undefYES#defineYES0max(){……..}YES原作用域YES新作用域宏定义可嵌套,不能递归例#defineMAXMAX+10(

)引号中的内容与宏名相同也不置换例#definePI3.14159printf(“2*PI=%f\n”,PI*2);宏展开:printf(“2*PI=%f\n”,3.14159*2);宏定义中使用必要的括号()例#defineWIDTH80#defineLENGTH

WIDTH+40var=LENGTH*2;宏展开:var=80+40*2;()()例#defineWIDTH80#defineLENGTH

WIDTH+40var=LENGTH*2;宏展开:var=80+40*2;带参数宏定义一般形式:#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));#defineMAX(x,y)(x)>(y)?(x):(y)…….main(){inta,b,c,d,t;…….t=MAX(a+b,c+d);……}宏展开:t=(a+b)>(c+d)?(a+b):(c+d);intmax(intx,inty){return(x>y?x:y);}main(){inta,b,c,d,t;…….t=max(a+b,c+d);………}例用宏定义和函数实现同样的功能带参的宏与函数区别带参宏函数处理过程不分配内存简单的字符置换分配内存先求实参值,再代入形参处理时间编译时程序运行时参数类型无类型问题定义实参,形参类型程序长度变长不变运行速度不占运行时间调用和返回占时间8.2

文件包含功能:一个源文件可将另一个源文件的内容全部包含进来一般形式:#include“文件名”或#include<文件名>#include“file2.c”file1.cfile2.cfile1.cfile2.cABA处理过程:预编译时,用被包含文件的内容取代该预处理命令,再对“包含”后的文件作一个源文件编译<>直接按标准目录搜索“”先在当前目录搜索,再搜索标准目录可指定路径被包含文件内容源文件(*.c)头文件(*.h)宏定义数据结构定义函数说明等文件包含可嵌套#include“file2.c”file1.cAfile3.cC#include“file3.c”file2.cBfile1.cAfile3.cfile2.c例文件包含举例/*powers.h*/#definesqr(x)((x)*(x))#definecube(x)((x)*(x)*(x))#definequad(x)((x)*(x)*(x)*(x))#include<stdio.h>#include"d:\fengyi\bkc\powers.h"#defineMAX_POWER10voidmain(){intn;printf("number\texp2\texp3\texp4\n");printf("----\t----\t-----\t------\n");for(n=1;n<=MAX_POWER;n++)printf("%2d\t%3d\t%4d\t%5d\n",n,sqr(n),cube(n),quad(n));}8.2常见错误分析第8章编译预处理思政目标1、培养严谨规范意识:遵循预处理指令规则宏定义和文件包含指令格式严格,学生需严谨对待,培养遵循规则的意识,确保程序正确编译和运行。2、提升问题解决能力:积极探索修正错误从错误中学习,积极寻找解决办法,增强学生解决问题的信心和能力,使其在编程中不断进步,勇于面对挑战。8.2常见错误分析8.2常见错误分析宏定义时缺少“#”1#include<stdio.h>definePI3.14159 /*缺少“#”号*/intmain(){ printf("%f\n",PI); return0;}宏定义必须以“#”开头,如果缺少“#”,编译器就会报错。例如:编译错误信息如图所示。原因是“define”前缺少标识符“#”号,只要添加了“#”号,此程序就能正确编译。8.2常见错误分析宏定义后面多分号2#include<stdio.h>#definePI3.14159; /*行末多了分号*/intmain(){ printf("%f\n",PI); return0;}宏定义不是C语句,不需要在行末加分号。如果加上分号,则连同分号一起置换。例如:8.2常见错误分析编译错误信息如图所示。它显示第5行出错,原因是在宏展开时将“PI”替换成“3.14159;”,而输出类型为浮点型数据,因此出错。只需将宏定义后的分号去掉即可。8.2常见错误分析文件包含命令中文件名错误3#include<sdtio.h> /*头文件名错误*/intmain(){ inta=3; printf("%d\n",a); return0;}例如:8.2常见错误分析编译错误信息如图所示,提示没有找到相应的头文件。修改头文件名为“stdio.h”即可。8.2常见错误分析本章小结本章首先介绍了宏定义命令,然后介绍了文件包含命令,最后介绍了条件编译命令。通过本章的学习,读者应重点掌握以下知识。掌握不带参数宏定义和带参数宏定义的具体方法。文件包含是预处理的一个重要功能,它可用于将多个源文件连接成一个源文件进行编译,并生成一个目标文件。读者应掌握文件包含命令的具体使用方法。了解条件编译命令的具体使用方法。使用预处理命令非常便于程序的修改、阅读、移植和调试,也便于实现模块化程序设计。在编写较大程序时,善于利用预处理命令能够很好地提高程序的质量。8.3经典题型第8章编译预处理思政目标1、巩固知识根基经典题解涵盖编译预处理核心知识,学生通过练习巩固宏定义、文件包含等基础,为编程学习筑牢基础。2、培养严谨态度解题需精准理解规则,如宏展开顺序、指令格式,培养学生严谨对待知识和问题的态度,提升准确性。

1、以下叙述中正确的是()。A)用#include包含的头文件的后缀不可以是“.a”B)若一些源程序中包含某个头文件,当该文件有错时,只需对该头文件进行修改,包含此头文件的所有源程序不必重新进行编译。C)宏命令行可以看做是一行C语句D)C编译中的预处理是在编译之前进行的答案:D)

2.下面是对宏定义的描述,不正确的是()。A)宏不存在类型问题,宏名无类型,它的参数也无类型B)宏替换不占用运行时间C)宏替换时先求出实参表达式的值,然后代入形参运算求值D)其实,宏替换只不过是字符替代而已答案:C)

3.以下程序的输出结果为()。#include<stdio.h>#defineSQR(x)x*xmain(){inta,k=3;a=++SQR(k+1);printf(“%d\n”,a);}A)6B)10C)8D)9答案:D)

1、宏展开(先替换后计算)

a=++SQR(k+1);a=++k+1*k+1;2、代入值计算

a=4+1*4+1a=94.以下程序的输出结果是()。#defineMIN(x,y)(x)<(y)?(x):(y)#include<stdio.h>main(){inti,j,k;i=10;j=15;k=10*MIN(i,j);printf(“%d\n”,k);}A)15B)100C)10D)1501、宏展开

k=10*MIN(i,j);k=10*(i)<(j)?(i):(j);2、代入值计算(考虑优先级)k=10*(10)<(15)?(10):(15);k=15答案:A)同步练习:1.以下说法中正确的是(c)。A)#define和printf都是C语句B)#define是C语句,而printf不是C)printf是C语句,但#define不是D)#define和printf都不是C语句8.以下正确的描述为(C)。A)每个C语言程序必须在开头使用预处理命令#include<stdio.h>B)预处理命令必须位于C源程序的首部C)在C语言中预处理命令都以“

温馨提示

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

评论

0/150

提交评论