《《预处理命令》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《预处理命令》PPT课件.ppt(25页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第九章 预处理命令主要内容9.1 宏定义9.2“文件包含”处理9.3 条件编译C C程序上机步骤程序上机步骤:编辑编辑编辑编辑链接链接链接链接编译编译编译编译执行执行执行执行程序代码的录入程序代码的录入程序代码的录入程序代码的录入,生成源程序生成源程序生成源程序生成源程序*.cpp(VC+)*.cpp(VC+)*.cpp(VC+)*.cpp(VC+)或或或或*.c(TC)*.c(TC)*.c(TC)*.c(TC)。语法分析查错,翻译生成目标语法分析查错,翻译生成目标语法分析查错,翻译生成目标语法分析查错,翻译生成目标程序程序程序程序*.obj*.obj*.obj*.obj。运行程序,得到程序结
2、果运行程序,得到程序结果运行程序,得到程序结果运行程序,得到程序结果。与其它目标程序或库链接与其它目标程序或库链接与其它目标程序或库链接与其它目标程序或库链接,生生生生成可执行程序成可执行程序成可执行程序成可执行程序*.exe*.exe*.exe*.exe。导读 C C语言提供了一些以语言提供了一些以#开头的指令,如:开头的指令,如:#define#include#define#include 等。等。这这些些指指令令是是在在编编译译以以前前就就事事先先进进行行处处理理的的,因因而而称称为为“编译预处理编译预处理”指令。指令。可以用编译预处理指令实现以下可以用编译预处理指令实现以下三种功能:三
3、种功能:(1)(1)宏定义宏定义 (2)(2)文件包含文件包含 (3)(3)条件编译条件编译 导读1 1、不带参的宏定义、不带参的宏定义用一个指定的标识符(宏名)代表一个字符串。用一个指定的标识符(宏名)代表一个字符串。一般形式:一般形式:#define#define 标识符标识符 字符串字符串 如如:#define PI 3.1415926#define PI 3.1415926 一般宏名用一般宏名用大写字母大写字母。有有了了这这一一宏宏定定义义后后,程程序序中中凡凡是是用用到到3.14159263.1415926的的地地方都可以以宏名方都可以以宏名PIPI出现。出现。9.1 宏定义 例:定
4、义一个宏名来代表一个参数。例:定义一个宏名来代表一个参数。#define PI 3.1415926#define PI 3.1415926void main()void main()float r=2,c,s;float r=2,c,s;c=2*PI*r;c=2*PI*r;s=PI*r*r;s=PI*r*r;系系统统在在对对程程序序进进行行编编译译以以前前,首首先先将将所所有有的的编编译译预预处处理理指指令令进进行行预预处处理理,对对本本例例来来说说,就就是是将将程程序序中中所所有的宏名有的宏名PIPI还原成还原成3.14159263.1415926,宏展开宏展开。9.1 宏定义c=2*3.1
5、415926*r;c=2*3.1415926*r;s=3.1415926*r*r;s=3.1415926*r*r;例:定义一个宏名来代表一个数据个数。例:定义一个宏名来代表一个数据个数。#define N#define N#include#include void main()void main()int aN,i;float s=0;int aN,i;float s=0;for(i=0;iN;i+)scanf(“%d”,&ai);for(i=0;iN;i+)scanf(“%d”,&ai);for(i=0;iN;i+)s+=ai;for(i=0;iN;i+)s+=ai;s/=N;s/=N;pr
6、intf(“n%f”,s);printf(“n%f”,s);宏名宏名N N等同于符号常量,可以作为数组的长度。等同于符号常量,可以作为数组的长度。方便修改参数方便修改参数50509.1 宏定义100100例:定义一个宏名来代表一个计算公式。例:定义一个宏名来代表一个计算公式。#define PI 3.1415926#define PI 3.1415926#define AREA PI*r*r#define AREA PI*r*r#include#include void main()void main()r=3,s;r=3,s;s=AREA;s=AREA;printf(“n%f”,s);pri
7、ntf(“n%f”,s);注意:系统对宏定义的预处理是一个字符串的还原过注意:系统对宏定义的预处理是一个字符串的还原过程。程。9.1 宏定义s=PI*r*r;s=PI*r*r;s=3.1415926*r*r;s=3.1415926*r*r;注意以下程序的运行结果:注意以下程序的运行结果:#define F#define F#include#include void main()void main()int x=3,y=5,z;int x=3,y=5,z;z=2*F;z=2*F;printf(“n%d”,z);printf(“n%d”,z);9.1 宏定义z=z*x+y;z=z*x+y;z=z*
8、(x+y);z=z*(x+y);(x+y)(x+y)()()x+yx+y2 2、带参的宏定义、带参的宏定义宏定义也可以带参数,其一般形式为:宏定义也可以带参数,其一般形式为:#define#define 宏名(参数表)宏名(参数表)字符串字符串如:如:#define S(a,b)a*b#define S(a,b)a*b area=S(3,2);area=S(3,2);定义宏名定义宏名S S代表矩形面积,参数代表矩形面积,参数a,ba,b为边长。为边长。宏展开过程:宏展开过程:S(3,2)S(3,2)a*ba*b3*29.1 宏定义在一个源文件中将另一个源文件的内容包含进来。在一个源文件中将另一
9、个源文件的内容包含进来。文件包含指令的一般形式:文件包含指令的一般形式:#include “#include “文件名文件名”或或#include#include 用用时时,系统在存放系统在存放C C库函数头文件的目录中寻找库函数头文件的目录中寻找要包含的文件要包含的文件,这称为标准方式。这称为标准方式。用用“”“”时,系统在用户当前目录中寻找要包含的文时,系统在用户当前目录中寻找要包含的文件,如果找不到,在按标准方式查找。件,如果找不到,在按标准方式查找。9.2“文件包含”处理#include“file2.c”Afile1.cABBfile1.cfile2.c9.2“文件包含”处理例:如果文
10、件例:如果文件1 1包含文件包含文件2 2,而文件,而文件2 2中要包含文件中要包含文件3 3的内容。的内容。file1.c#include“file2.c”file2.c#include“file3.c”file3.cCABfile1.cCBA9.2“文件包含”处理例:如果文件例:如果文件1 1包含文件包含文件2 2,而文件,而文件2 2中要包含文件中要包含文件3 3的内容。的内容。file1.c#include“file3.c”#include“file2.c”file2.cfile3.cCABfile1.cCBA9.2“文件包含”处理#include“file2.c”#include“f
11、ile3.c”CB例:例:#include#include void main()float a,b,c,s,area;scanf(“%f%f%f”,&a,&b,&c);s=0.5*(a+b+c);area=sqrt(s*(s-a)*(s-b)*(s-c);printf(“n%f”,area);9.2“文件包含”处理#include “f.h”#include void main()printf(“n%f”,f1(3.0);printf(“n%f”,fac(10);float f1(float r)return(PI*r*r);float fac(int n)int i;float s=1;f
12、or(i=1;i=n;i+)s*=i;return(s);#define PI 3.1415926float f1(float r);float fac(int n);f.cf.h9.2“文件包含”处理9.3 条件编译 一般情况下,源程序中所有行都参加编译,但是一般情况下,源程序中所有行都参加编译,但是有时希望程序中一部分内容只在满足一定条件时才有时希望程序中一部分内容只在满足一定条件时才进行编译,也就是对一部分内容指定编译的条件,进行编译,也就是对一部分内容指定编译的条件,这就是这就是条件编译条件编译。9.3 条件编译条件编译命令有以下几种形式:条件编译命令有以下几种形式:(1)ifdef
13、标识符标识符 程序段程序段1 else 程序段程序段2 endif或或 ifdef 标识符标识符 程序段程序段1 endif 作用:作用:若指定的标识符已经被若指定的标识符已经被#define#define 命令定义过,命令定义过,则在程序编译阶段编译程序段则在程序编译阶段编译程序段1 1;否则编译程序段;否则编译程序段2 2。其中其中#else#else部分可以没有。部分可以没有。9.3 条件编译#ifdef COMPUTER_A#ifdef COMPUTER_A#define INTEGER_SIZE 16#define INTEGER_SIZE 16#else#else#define I
14、NTEGER_SIZE 32#define INTEGER_SIZE 32#endif#endif例:条件编译可以提高例:条件编译可以提高C源程序的通用性源程序的通用性如果在这组条件编译命令之前曾出现以下命令:如果在这组条件编译命令之前曾出现以下命令:define COMPUTER_A 0define COMPUTER_A 0或或define COMPUTER_A define COMPUTER_A 只要只要COMPUTER_ACOMPUTER_A定义过。定义过。9.3 条件编译 例:在调试程序时,希望输出一些信息,而调试例:在调试程序时,希望输出一些信息,而调试完后不在输出这些信息。完后不在
15、输出这些信息。#ifdef DEBUG#ifdef DEBUG printf(“x=%d,y=%d”,x,y);printf(“x=%d,y=%d”,x,y);#endif#endif如果在这组条件编译命令之前出现以下命令:如果在这组条件编译命令之前出现以下命令:define DEBUGdefine DEBUG9.3 条件编译(2)ifndef 标识符标识符 程序段程序段1 else 程序段程序段2 endif作用:作用:若指定的标识符未被若指定的标识符未被#define#define 命令定义过,则命令定义过,则在程序编译阶段编译程序段在程序编译阶段编译程序段1 1;否则编译程序段;否则编译
16、程序段2 2。其。其中中#else#else部分可以没有。部分可以没有。9.3 条件编译(3)if 表达式表达式 程序段程序段1 else 程序段程序段2 endif作用:作用:若指定的表达式为真(非若指定的表达式为真(非0 0)时,则在程序编)时,则在程序编译阶段编译程序段译阶段编译程序段1 1;否则编译程序段;否则编译程序段2 2。9.3 条件编译例:输入一行字母字符,根据需要设置条件编译,使之能将例:输入一行字母字符,根据需要设置条件编译,使之能将字母全改为大写输出,或全改为小写字母输出。字母全改为大写输出,或全改为小写字母输出。include include#define LETTER
17、#define LETTERvoid main()void main()char str20=“C Language”,c;char str20=“C Language”,c;int i=0;int i=0;while(c=stri)!=0)while(c=stri)!=0)i+;i+;#if LETTER#if LETTER if(c=a&c=a&c=A&c=A&c=Z)c=c+32;c=c+32;#endif#endif printf(“%c”,c);printf(“%c”,c);0 1练习1 1、请分析以下一组宏定义的输出格式:、请分析以下一组宏定义的输出格式:#define NL pu
18、tchar(n)#define NL putchar(n)#define PR(format,value)printf(“value=%formatet”,(value)#define PR(format,value)printf(“value=%formatet”,(value)#define PRINT1(f,x1)PR(f,x1);NL#define PRINT1(f,x1)PR(f,x1);NL#define print2(f,x1,x2)PR(f,x1);PRINT1(f,x2)#define print2(f,x1,x2)PR(f,x1);PRINT1(f,x2)如果在程序中有以下的宏引用:如果在程序中有以下的宏引用:PRPR(d,x);d,x);PRINT1PRINT1(d,xd,x);PRINT2PRINT2(d,x1,x2d,x1,x2););写出宏展开后的情况,并写出应输出的结果,设写出宏展开后的情况,并写出应输出的结果,设x=5,x1=3,x2=8x=5,x1=3,x2=8。2 2、定义个带参数的宏,使两个参数的值互换,并写出程序,输入两个数作为、定义个带参数的宏,使两个参数的值互换,并写出程序,输入两个数作为使用宏时的实参。输出已交换后的两个值。使用宏时的实参。输出已交换后的两个值。Thanks