《C语言-第7章编译预处理.ppt》由会员分享,可在线阅读,更多相关《C语言-第7章编译预处理.ppt(13页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第7 7章章 编译预处理编译预处理 预处理:是指在进行编译之前所作的工作。预处理:是指在进行编译之前所作的工作。预处理由预处理由预处理程序预处理程序负责完成。当对一个源文负责完成。当对一个源文件进行编译时,件进行编译时,编译系统将自动引用编译系统将自动引用预处理程序预处理程序对源程序中的预处理命令作处理,对源程序中的预处理命令作处理,处理完毕后自处理完毕后自动进入对源程序的编译。动进入对源程序的编译。l预处理命令:预处理命令:#define,#undef,#include,#else,#error#define,#undef,#include,#else,#errorl预处理命令行可位于程序
2、中任意位置预处理命令行可位于程序中任意位置l预处理命令行的作用域:定义位置开始到预处理命令行的作用域:定义位置开始到文件结尾文件结尾7.1 7.1 宏定义宏定义:#define#define7.2 7.2 文件包含文件包含:#include:#include第第7 7章章 编译预处理编译预处理J 宏定义是由源程序中的宏定义命令完成的。宏定义是由源程序中的宏定义命令完成的。J 在在C C语言中,语言中,“宏宏”分为有参数宏和无参宏两分为有参数宏和无参宏两种。种。7.1 7.1 宏定义宏定义:#define如:无参宏如:无参宏#define PI 3.1415926如:有参宏如:有参宏#defin
3、e AS(x,y,z)x+y+z无参宏定义无参宏定义一般形式一般形式:#define#define 宏名宏名 宏体宏体definedefine:宏定义命令宏定义命令 宏名宏名:由标识符定义由标识符定义宏体宏体:为一字符串(常量、表达式、格式串等)为一字符串(常量、表达式、格式串等)definedefine、宏名、宏体之间用空格隔开、宏名、宏体之间用空格隔开宏调用格式:宏调用格式:宏名宏名宏替换:编译预处理时进行宏展开宏替换:编译预处理时进行宏展开,对宏定义命对宏定义命令行后出现的令行后出现的宏名宏名用用宏体代替。宏体代替。#define PI 3.1415926main()float a,s,
4、r;printf(Input radius r:);scanf(%f,&r);a=2*PI*r;s=PI*r*r;printf(r=%10.4fna=%10.4fns=%10.4fn,r,a,s);宏替换后宏替换后:a=2*3.1415926*r;s=3.1415926*r*r;实实 例例宏调用宏调用Z 宏替换时只是简单地以宏体取代宏名,预处理程宏替换时只是简单地以宏体取代宏名,预处理程序并不作语法检查。如有错误序并不作语法检查。如有错误,只能在编译时发现。只能在编译时发现。#define PI#define PI 3.1415933.141593;L=2*PI*r L=2*PI*r;宏展开后
5、,该语句为:宏展开后,该语句为:L=2*L=2*3.1415933.141593;*r r;Z宏名在源程序中若用引号引起来,则预处理程序不宏名在源程序中若用引号引起来,则预处理程序不对其作宏代换。如对其作宏代换。如:#define no 220 main()printf(“no”);说说 明明出错出错不替换不替换Z 宏定义可以嵌套:宏定义可以嵌套:X 在宏体中可以使用已经定义的宏名。在宏展在宏体中可以使用已经定义的宏名。在宏展开时由预处理程序层层代换。开时由预处理程序层层代换。以下程序中的以下程序中的for循环执行的次数是循环执行的次数是()。#define N 2#define M N+1#
6、define NUM 2*M+1main()int i;for(i=1;i=NUM;i+)printf(“%dn”,i);A.5 B.6 C.7 D.8 说说 明明思考思考#define M y*y+3*ymain()int s,y;printf(input a number:);scanf(%d,&y);s=3*M +4*M +5*M;printf(s=%dn,s);y*y+3*yy*y+3*yy*y+3*y(y*y+3*y)(y*y+3*y)(y*y+3*y)继续理解继续理解带参宏定义带参宏定义一般形式一般形式:#define#define 宏名宏名(形参表形参表)宏体宏体l宏调用:宏调用
7、:宏名宏名(实参表实参表)l宏替换:编译预处理时用宏体代换带参宏宏替换:编译预处理时用宏体代换带参宏,同时同时用用实参代换形参实参代换形参例如例如:#define AS(x,y,z)x+y+zsum=AS(3,4,5);宏替换后:宏替换后:sum=3+4+5;l宏定义时宏定义时,在在宏名与带参数的括号宏名与带参数的括号之间之间不能有空格不能有空格,否则将空格以后的字符都作为宏体否则将空格以后的字符都作为宏体.例如例如:#define s(r)PI*r*r:#define s(r)PI*r*r下列程序执行后的输出结果是下列程序执行后的输出结果是()。#define MA(x)x*(x-1)mai
8、n()int a=1,b=2;printf(“%d n”,MA(1+a+b);A.6 B.8 C.10 D.12 说说 明明思考思考X是指一个源文件可将另一个源文件的全部内容包是指一个源文件可将另一个源文件的全部内容包含进来含进来X一般形式一般形式:#include“文件名文件名”或或#include X所包含的文件可以是标准文件或用户自定义文件所包含的文件可以是标准文件或用户自定义文件例如例如:#include“math.h”7.2 7.2 文文 件件 包包 含含X#include 命令行一般放在程序开头。命令行一般放在程序开头。X一个程序中,允许有任意多个预编译命令行一个程序中,允许有任意
9、多个预编译命令行X预编译时,预处理程序把指定的文件预编译时,预处理程序把指定的文件插入该命令行插入该命令行位置取代该命令行位置取代该命令行,从而把指定的文件和当前的源,从而把指定的文件和当前的源程序文件连成一个源文件。程序文件连成一个源文件。/*文件文件4.c*/float ave(float a,int n)int k;float aver,sum=a0;for(k=1;kn;k+)sum=sum+ak;aver=sum/n;return(aver);/*文件文件3.c*/#include“4.cmain()float s10;int k;for(k=0;k10;k+)scanf(%f,&sk);printf(%5.2fn,ave(s,5);说说 明明本章小结本章小结l本章介绍的预编译功能(宏定义、文件包含、条本章介绍的预编译功能(宏定义、文件包含、条件编译)是件编译)是C语言特有的,有利于程序的可移植语言特有的,有利于程序的可移植性,增加程序的灵活性。性,增加程序的灵活性。lC语言中的宏定义分为两种:语言中的宏定义分为两种:不带参数的宏定义不带参数的宏定义和和带参数的宏定义带参数的宏定义。l 使用标准库函数时,应当包含相应的头文件。也使用标准库函数时,应当包含相应的头文件。也可设计自己的头文件,将常用内容包含进去。可设计自己的头文件,将常用内容包含进去。
限制150内