首页 c8 x编译预处理

c8 x编译预处理

举报
开通vip

c8 x编译预处理C语言程序设计第8章编译预处理问题:实际生活中,为了更好地处理一些事件或数据,会对其提前进行设定和准备,如:在对源程序进行通常的编译之前,先对程序中一些特殊的命令进行“预处理”。编译预处理为避免重复,对已有的实行“拿来主义”。ANSIC标准规定可以在C源程序中加入一些“预处理命令”,以改进程序设计环境,提高编程效率。引子本章要点第8章编译预处理本章难点预处理的概念C语言处理系统的预处理功能预处理命令的使用带参宏定义条件编译编译预处理作用:对源程序编译之前做一些处理,生成扩展C源程序种类宏定义#define条件编译#...

c8 x编译预处理
C语言程序设计第8章编译预处理问题:实际生活中,为了更好地处理一些事件或数据,会对其提前进行设定和准备,如:在对源程序进行通常的编译之前,先对程序中一些特殊的命令进行“预处理”。编译预处理为避免重复,对已有的实行“拿来主义”。ANSIC标准规定可以在C源程序中加入一些“预处理命令”,以改进程序设计环境,提高编程效率。引子本章要点第8章编译预处理本章难点预处理的概念C语言处理系统的预处理功能预处理命令的使用带参宏定义条件编译编译预处理作用:对源程序编译之前做一些处理,生成扩展C源程序种类宏定义#define条件编译#if--#else--#endif等文件包含#include格式:“#”开头占单独 关于书的成语关于读书的排比句社区图书漂流公约怎么写关于读书的小报汉书pdf 写行语句尾不加分号8.18.28.3宏定义条件编译文件包含第8章编译预处理宏定义的分类不带参数宏定义一般形式:#define宏名[宏体]功能:用指定标识符(宏名)代替字符序列(宏体)宏展开:预编译时,用宏体替换宏名---不作语法检查如#defineYES1#defineNO0#definePI3.1415926#defineOUTprintf(“Hello,World”);宏体可缺省, 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 示宏名定义过或取消宏体定义位置:任意(一般在函数外面)作用域:从定义命令到文件结束#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#defineLENGTHWIDTH+40var=LENGTH*2;宏展开:var=80+40*2;()()例#defineWIDTH80#defineLENGTHWIDTH+40var=LENGTH*2;宏展开:var=80+40*2;8.1宏定义例8.1用不带参数的宏定义计算s=3*(y*y+3*y)+4*(y*y+3*y)+5*(y*y+3*y)#defineM(y*y+3*y)main(){ints,y;printf("Pleaseinputanumber:");scanf("%d",&y);s=3*M+4*M+5*M;printf("s=%d\n",s);}运行情况如下:Pleaseinputanumber:4↙s=336算法分析:单在计算式子中出现了三个(y*y+3*y),为减少书写量,可使用宏定义。注意:#defineM(y*y+3*y)(y*y+3*y)两边的括号不能少。带参数宏定义一般形式:#define宏名(参数表)宏体宏展开:先把宏引用替换为替换文本,再将替换文本中出现的形参用实参代替。例#defineS(a,b)a*b8.1宏定义例#defineS(r)PI*r*r相当于定义了不带参宏S,代表字符串“(r)PI*r*r”例#defineM(y)y*y+3*y……k=M(5);宏展开时,先用y*y+3*y替换M(5),再将替换文本中的形参y用实参5代替,最终得到:k=5*5+3*5;不能加空格#defineMAX(x,y)(x)>(y)?(x):(y)main(){intx,y,max;printf("inputtwonumbers(x,y):");scanf("%d,%d",&x,&y);max=MAX(x,y);printf("max=%d\n",max);}例8.3用带参宏定义求两数中的大者。运行情况如下:inputtwonumbers(x,y):5,6↙max=6MAX(x,y)替换为:(x)>(y)?(x):(y)进一步替换为:(5)>(6)?(5):(6)宏体及各形参外一般应加括号()例#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));8.1宏定义例8.2分别引用以下宏定义,求3*F(3+2)的值。(A)#defineF(x)x*x+x(B)#defineF(x)(x)*(x)+(x)(C)#defineF(x)(x*x+x)(D)#defineF(x)((x)*(x)+(x))解:表达式3*F(3+2)在分别引用以上4个宏定义后,其值为:替换为:3*x*x+x=3*3+2*3+2+3+2=22。(B)替换为:3(x)*(x)+(x)=3*(3+2)*(3+2)+(3+2)=80。(C)替换为:3*(x*x+x)=3*(3+2*3+2+3+2)=48。(D)替换为:3*((x)*(x)+(x))=3*((3+2)*(3+2)+(3+2))=90。例8.4一个宏定义代表多条语句。#defineSSSV(s1,s2,s3,v)s1=l*w;s2=l*h;s3=w*h;v=w*l*h;main(){intl=3,w=4,h=5,sa,sb,sc,vv;SSSV(sa,sb,sc,vv);printf("sa=%d\nsb=%d\nsc=%d\nvv=%d\n",sa,sb,sc,vv);}运行情况如下:sa=12sb=15sc=20vv=60宏定义也可用来定义多个语句。带参的宏与函数区别定义方式不同。带参宏使用预处理命令#define定义;而函数使用函数定义。参数性质不同。带参宏的参数表中的参数不必说明其类型,也不分配存储空间;而函数参数表中的参数需说明其类型并为其分配存储空间。实现方式不同。宏展开是在编译时由预处理程序完成的,不占用运行时间;而函数调用是在程序运行时进行,需占用一定的运行时间。参数传递不同。若实参为表达式,引用带参宏时只进行简单的字符替换,不计算实参表达式的值;而函数调用时,则先计算表达式的值,然后代入形参。返回值不同。带参宏定义无返回值;而函数有返回值。#defineSQ_MACRO(y)((y)*(y))main(){inti=1;printf("SQ_fun:\n");while(i<=5)printf("%d\n",SQ_fun(i++));i=1;printf("SQ_MACRO:\n");while(i<=5)printf("%d\n",SQ_MACRO(i++));}SQ_fun(inty){return((y)*(y));}例8.8函数与带参宏定义的进一步比较。运行情况如下:SQ_fun:1491625SQ_MACRO:1925条件编译的功能:在编译源文件之前,根据给定的条件决定编译的范围。形式一:#ifdef标识符程序段1#else程序段2#endif如果标识符是已被#define命令定义过的宏名,就对程序段1进行编译;否则对程序段2进行编译。8.2条件编译没有else时,可省略条件编译举例#defineDEBUGmain(){inta=4;#ifdefDEBUGprintf("Nowtheprogrammerisdebuggingtheprogram.");#elseprintf("a=%d.",a);#endif}若没有第一行的宏定义命令,程序运行后会输出:a=4.运行情况如下:Nowtheprogrammerisdebuggingtheprogram.条件编译形式二:#ifndef标识符程序段1#else程序段2#endif如果标识符未被#define命令定义过,就对程序段1进行编译;否则对程序段2进行编译。形式三:#if常量表达式程序段1#else程序段2#endif如果常量表达式的值为真(非0),就对程序段1进行编译;否则对程序段2进行编译。例8.10设置一个开关,判断输入值是半径还是边长,实现求圆或正方形的面积。#defineR1main(){floatc,r,s;printf("inputanumber:");scanf("%f",&c);#ifRr=3.14159*c*c;printf("areaofroundis:%f\n",r);#elses=c*c;printf("areaofsquareis:%f\n",s);#endif}运行情况如下:inputanumber:3↙areaofroundis:28.274309若程序的第一行改为:#defineR0则程序运行情况如下:inputanumber:3↙areaofsquareis:9.000000条件编译与条件语句的区别:条件编译也是一种选择结构。它根据给定的条件,从源程序段1和源程序段2中选择其中之一进行编译。使用条件语句将会对整个源程序进行编译,生成的目标代码较长。而采用条件编译,则根据条件只编译其中的程序段1或程序段2,生成的目标代码较短。在程序调试时,经常需要查看某些变量的中间结果。这时也可以使用条件编译,在程序中设置若干调试用的语句。例如:#defineFLAG1#ifFLAGprintf("a=%d",a);#endif文件包含的功能:一个源文件可将另一个源文件的内容全部包含进来。一般形式:#include“文件名”或#include<文件名>#include“file2.c”file1.cfile2.cfile1.cBABA处理过程:预编译时,用被包含文件的内容取代该预处理命令,再对“包含”后的文件作一个源文件编译。“”先在当前目录搜索,再搜索标准目录;可指定路径;<>直接按标准目录搜索,不能指定路径头文件必须是文本文件,扩展名没限制8.3文件包含例#include"C:\TC\F2.c"√#include被包含文件内容源文件(*.c)头文件(*.h)stdio.h:EOF和NULL宏定义及输入输出函数的原型math.h:各个数学函数的原型文件包含可嵌套#include“file2.c”file1.cAfile3.cC#include“file3.c”file2.cBfile1.cACB将那些公用的或常用的宏定义、函数原型、数据类型定义及全局变量的定义和声明等,组织在一些头文件中,在程序需要使用到这些信息时,就用#include命令把它们包含到所需的位置上去,从而免去每次使用它们时都要重新定义或声明的麻烦。例8.11用户头文件的编写和使用#ifndef_L8_11_H/*定义宏,以防止重复包含此头文件*/#define_L8_11_H#include#defineADD(a,b)((a)+(b))/*定义宏,实现两数的加法*/#defineSUB(a,b)((a)-(b))/*定义宏,实现两数的减法*/intMUL(inta,intb)/*定义函数,实现两数的乘法*/{returna*b;}floatDIV(floata,floatb)/*定义函数,实现两数的除法*/{if(b!=0)returna/b;elseprintf("Error!Thedenocannotbezero!");}#endif头文件L8_11.h#include"L8_11.h"/*包含自定义头文件*/main(){inta,b;intsum,product;floatdifference,quotient;printf("Pleaseinputtwonumbers:");scanf("%d,%d",&a,&b);sum=ADD(a,b);difference=SUB(a,b);product=MUL(a,b);quotient=DIV(a,b);printf("sum=%ddifference=%f\n",sum,difference);printf("product=%dquotient=%f\n",product,quotient);}程序运行情况如下:Pleaseinputtwonumbers:34,12↙sum=46difference=22.000000product=408quotient=2.833333注意一个#include命令只能包含一个头文件,若有多个文件要包含,则需用多个#include命令。例如:如果file1.c中包含file2.c,而file2.c中要用到file3.c的内容,则可在file1.c中用两个#include命令进行包含,包含顺序如下:#include"file3.c"#include"file2.c"当某个头文件的内容发生变化时,意味着包含该头文件的源程序也发生变化,所以需要重新编译。课后习题1-1:#include#defineN2#defineMN+1#defineNUM(M+1)*M/2main(){inti;for(i=1;i<=NUM;i++);printf("%d\n",i);}程序结果:9计算过程:NUM替换为:(M+1)*M/2=(N+1+1)*N+1/2=(2+1+1)*2+1/2=8课后习题1-2:#include#defineMIN(x,y)(x)<(y)?(x):(y)main(){inti,j,k;i=10;j=15;k=10*MIN(i,j);printf("%d\n",k);}程序结果:15计算过程:10*MIN(i,j)替换为:10*(x)<(y)?(x):(y)=10*(i)<(j)?(i):(j)=10*(10)<(15)?(10):(15)=15
本文档为【c8 x编译预处理】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
正方体
暂无简介~
格式:ppt
大小:311KB
软件:PowerPoint
页数:25
分类:成人教育
上传时间:2022-05-10
浏览量:0