欢迎来到天天文库
浏览记录
ID:52402420
大小:420.01 KB
页数:23页
时间:2020-04-05
《预处理和动态存储分配.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第13章编译预处理和动态存储分配高级语言的源程序编译、连接目标代码。编译预处理上机过程:13.1编译预处理在C编译程序对源程序进行编译前,由编译预处理程序对预处理命令行(以#号开始的预处理命令行)进行处理,然后对预处理后的源程序进行编译、连接,产生可执行的目标代码。C主要提供三种预处理命令:宏定义、文件包含和条件编译。本章重点介绍前两种。1.宏定义(宏替换)有两种:不带参数宏定义和带参数宏定义。(1)不带参数宏定义形式#define宏名替换文本其中:宏名是用户定义的标识符。替换文本是字符串。作用
2、:编译预处理程序对源程序中所有表示宏名的标识符用字符串来替换。例如:#defineN100编译预处理程序对源程序中所有N用100替换。例:使用不带参数的宏定义。#defineN10voidmain(){inta[N],i;for(i=0;i3、已定义过的宏名。例:#definePI3.14159#defineN100#defineMN*PI最后一个宏定义,编译预处理程序对源程序中所有M用100*3.14159替换。4)宏定义行的最后一个字符是””,表示下一行内容是本行的续行。例:#defineLEAP_YEARyear%4==0&&year%100!=04、5、year%400==05)同一个宏名不能重复定义。6)替换文本不能替换双引号中与宏名相同的字符串。例:#defineK2*3.14voidmain(){printf(“Key”6、);}例:不带参数的宏定义。#definePRprintf(“”)voidmain(){inti,j,k;i=15;j=9;printf(“%d%d”,i+j,i-j);PR;/*展开:printf(“”)*/printf(“%d%d”,i*j,i/j);PR;/*展开:printf(“”)*/}(2)带参数的宏定义形式#define宏名(形参表)替换文本其中:宏名是用户定义的标识符。形参表指定的形参(由标识符命名),形参之间用逗号分开。替换文本是字符串(通常包含指定的形参)。作用:7、编译预处理程序对源程序中出现的带实参的宏,用实参对#define命令行中的替换文本(字符串)中形参进行替换。例如:#defineF(x,y)x*x+y*y┆intd1;d1=F(3,2)+10;/*d1=3*3+2*2+10;*/把实参3和2代替宏定义中形参x和y,即F(3,2)表示3*3+2*2。例:带参数的宏定义。#defineM(x,y)x>y?x:yvoidmain(){inti,j,k;i=5;j=10;k=10*M(i,j);/*展开:k=10*5>10?5:10;*/printf(8、“%d”,k)}说明:1)调用带参数的宏时,实参与形参的个数应相同。2)实参可以是常量、变量或表达式形式。3)带参数宏替换与函数调用有类似之处,但前者对参数没有类型的要求。4)宏替换中,实参不能替换双引号中的形参。5)与不带参数的宏定义一样,同一个宏名不能重复定义。(3)终止宏定义形式#undef已定义宏名例如:#definePI3.14159main()┆#undefPI从终止宏定义(#undefPI)后PI无定义,不代表3.14159了。*使用宏定义的优势:1)宏替换不占程序运行时间,只9、占编译时间。2)便于阅读3)修改方便注意:宏定义最后没有“;”。2.文件包含就是在一个文件中,将已有的另外一个文件的全部内容包含进来。由于C的库函数很多,将这些函数根据类型不同分类,分别放在不同的文件中(例如,数学函数:math.h、输入/出:stdio.h、字符函数:ctype.h、字符串:string.h、动态分配:malloc.h其它:tdlib.h。),编程时,使用哪个文件中的函数,将该文件用文件包含的形式,写在程序的前面。C语言提供了#include命令行,实现“文件包含”功能,其一般10、形式为:#include“文件名”或#include<文件名>编译预程序将用指定的文件中的内容替换此命令行。如果文件名用双引号括起来时,系统先在用户当前目录查找要包含的文件,若找不到,再按标准方式(系统指定的目录)查找;如果文件名用尖括号括起来时,按标准方式查找。说明:1)#include命令行的位置一般写在源程序的开头,文件名后缀不一定是“.h”。2)包含文件(头文件)中,可包含一些#define命令行、外部说明或对库函数的原形说明。例:将格式宏做成头文件format.h。头文件format.
3、已定义过的宏名。例:#definePI3.14159#defineN100#defineMN*PI最后一个宏定义,编译预处理程序对源程序中所有M用100*3.14159替换。4)宏定义行的最后一个字符是””,表示下一行内容是本行的续行。例:#defineLEAP_YEARyear%4==0&&year%100!=0
4、
5、year%400==05)同一个宏名不能重复定义。6)替换文本不能替换双引号中与宏名相同的字符串。例:#defineK2*3.14voidmain(){printf(“Key”
6、);}例:不带参数的宏定义。#definePRprintf(“”)voidmain(){inti,j,k;i=15;j=9;printf(“%d%d”,i+j,i-j);PR;/*展开:printf(“”)*/printf(“%d%d”,i*j,i/j);PR;/*展开:printf(“”)*/}(2)带参数的宏定义形式#define宏名(形参表)替换文本其中:宏名是用户定义的标识符。形参表指定的形参(由标识符命名),形参之间用逗号分开。替换文本是字符串(通常包含指定的形参)。作用:
7、编译预处理程序对源程序中出现的带实参的宏,用实参对#define命令行中的替换文本(字符串)中形参进行替换。例如:#defineF(x,y)x*x+y*y┆intd1;d1=F(3,2)+10;/*d1=3*3+2*2+10;*/把实参3和2代替宏定义中形参x和y,即F(3,2)表示3*3+2*2。例:带参数的宏定义。#defineM(x,y)x>y?x:yvoidmain(){inti,j,k;i=5;j=10;k=10*M(i,j);/*展开:k=10*5>10?5:10;*/printf(
8、“%d”,k)}说明:1)调用带参数的宏时,实参与形参的个数应相同。2)实参可以是常量、变量或表达式形式。3)带参数宏替换与函数调用有类似之处,但前者对参数没有类型的要求。4)宏替换中,实参不能替换双引号中的形参。5)与不带参数的宏定义一样,同一个宏名不能重复定义。(3)终止宏定义形式#undef已定义宏名例如:#definePI3.14159main()┆#undefPI从终止宏定义(#undefPI)后PI无定义,不代表3.14159了。*使用宏定义的优势:1)宏替换不占程序运行时间,只
9、占编译时间。2)便于阅读3)修改方便注意:宏定义最后没有“;”。2.文件包含就是在一个文件中,将已有的另外一个文件的全部内容包含进来。由于C的库函数很多,将这些函数根据类型不同分类,分别放在不同的文件中(例如,数学函数:math.h、输入/出:stdio.h、字符函数:ctype.h、字符串:string.h、动态分配:malloc.h其它:tdlib.h。),编程时,使用哪个文件中的函数,将该文件用文件包含的形式,写在程序的前面。C语言提供了#include命令行,实现“文件包含”功能,其一般
10、形式为:#include“文件名”或#include<文件名>编译预程序将用指定的文件中的内容替换此命令行。如果文件名用双引号括起来时,系统先在用户当前目录查找要包含的文件,若找不到,再按标准方式(系统指定的目录)查找;如果文件名用尖括号括起来时,按标准方式查找。说明:1)#include命令行的位置一般写在源程序的开头,文件名后缀不一定是“.h”。2)包含文件(头文件)中,可包含一些#define命令行、外部说明或对库函数的原形说明。例:将格式宏做成头文件format.h。头文件format.
此文档下载收益归作者所有