第01章预处理ppt课件_第1页
第01章预处理ppt课件_第2页
第01章预处理ppt课件_第3页
第01章预处理ppt课件_第4页
第01章预处理ppt课件_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

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

文档简介

1、第九章第九章l 本章教学要点本章教学要点 C程序设计教程程序设计教程 - /l 主要内容主要内容9.1 9.1 宏定义宏定义 9.2 9.2 文件包含文件包含 9.3 9.3 条件编译条件编译 42022-5-5 C C程序设计教程程序设计教程 - - http:/ 根本概念根本概念n 在在C C源程序中参与一些源程序中参与一些“预处置命令,可以改善预处置命令,可以改善C C言言语的程序设计环境,提高编程效率。语的程序设计环境,提高编程效率。n 例如,假设程序中用例如,假设程序中用#define#define命令定义了符号常量命令定义了符号常量PIPI。n #d

2、efine PI 3.14159 #define PI 3.14159 n 经过预处置后程序可由编译程序对预处置后的源程序经过预处置后程序可由编译程序对预处置后的源程序进展通常的编译处置,得到可供执行的目的代码。其根进展通常的编译处置,得到可供执行的目的代码。其根本处置过程本处置过程 如图:如图:52022-5-5 C C程序设计教程程序设计教程 - - http:/ 1 1宏定义宏定义 2 2文件包含文件包含 3 3条件编译条件编译 这些功能分别用宏定义命令、文件包含命令、条件编这些功能分别用宏定义命令、文件包含命令、条件编译命令来实现。为了与普通语句相区别,这些命令以译命令来实现。为了与普

3、通语句相区别,这些命令以符号符号“开头。开头。 例如:例如: #define #define #include #include 根本概念根本概念62022-5-5 C C程序设计教程程序设计教程 - - http:/ 宏定义宏定义9.1.1 9.1.1 不带参数的宏定义不带参数的宏定义宏名后不带参数的宏定义是用一个指定的标识符来代表一宏名后不带参数的宏定义是用一个指定的标识符来代表一个字符串。个字符串。 普通方式:普通方式: #define #define 标识符标识符 字符串字符串72022-5-5 C C程序设计教程程序设计教程 - - http:/ 9.1 宏定义宏定义例:例: 不带参

4、数的宏定义例如。不带参数的宏定义例如。#include #include #define M (x#define M (x* *x+2x+2* *x-1)x-1)void main()void main() int x,y; int x,y; printf(input a number:); printf(input a number:); scanf(%d,&x); scanf(%d,&x); y= x y= x* *M+2M+2* *M+1;M+1; printf(y=%dn,y); printf(y=%dn,y); 程序运转结果:程序运转结果:input a number

5、: 2 input a number: 2 y=29y=29在预处置时经宏交换后该语句变为:在预处置时经宏交换后该语句变为: y=x y=x* *(x(x* *x+2x+2* *x-1)+2x-1)+2* *(x(x* *x+2x+2* *x-1)+1x-1)+1; / /* *即即y=x3+4x2+3x-1y=x3+4x2+3x-1* */ /82022-5-5 C C程序设计教程程序设计教程 - - http:/ 8.1 宏定义宏定义例如,当进展如下的宏定义:例如,当进展如下的宏定义: #difine M x #difine M x* *x+2x+2* *x-1x-1在宏交换后将得到下述语

6、句:在宏交换后将得到下述语句: Y=x Y=x* *x x* *x+2x+2* *x-1+2x-1+2* *x x* *x+2x+2* *x-1+1x-1+1; / /* *这相当于这相当于y= x3+2x2+4y= x3+2x2+4* *x-1x-1;* */ /92022-5-5 C C程序设计教程程序设计教程 - - http:/ 8.1 宏定义宏定义对于宏定义还要阐明以下几点:对于宏定义还要阐明以下几点: 1 1宏定义是用标识符宏名来表示一个字符串,在宏定义是用标识符宏名来表示一个字符串,在宏展开时又以该字符串取代宏名,这只是一种简单的交换,宏展开时又以该字符串取代宏名,这只是一种简单

7、的交换,字符串中可以含任何字符,可以是常数,也可以是表达式,字符串中可以含任何字符,可以是常数,也可以是表达式,预处置程序对它不作任何检查。如有错误,只能在编译已被预处置程序对它不作任何检查。如有错误,只能在编译已被宏展开后的源程序时发现。宏展开后的源程序时发现。 2 2宏定义不是声明或语句,在行末不用加分号,如加宏定义不是声明或语句,在行末不用加分号,如加上分号那么连分号也一同置换。上分号那么连分号也一同置换。3 3宏定义必需写在函数之外,其作用域为宏定义命令起到宏定义必需写在函数之外,其作用域为宏定义命令起到源程序终了。假设要终止其作用域,可运用源程序终了。假设要终止其作用域,可运用#un

8、def#undef命令。命令。102022-5-5 C C程序设计教程程序设计教程 - - http:/ 4宏名假设在源程序中假设用引号括起来,那么预处置程宏名假设在源程序中假设用引号括起来,那么预处置程序不对其作宏交换。序不对其作宏交换。P206P206例例9.29.2中的中的L L5 5宏定义允许嵌套,在宏定义的字符串中可以运用曾经定宏定义允许嵌套,在宏定义的字符串中可以运用曾经定义的宏名。在宏展开时由预处置程序层层交换。义的宏名。在宏展开时由预处置程序层层交换。 例如:例如: #define PI 3.1415926 #define PI 3.1415926 #define S PI #

9、define S PI* *y y* *y /y /* * PI PI是已定义的宏名是已定义的宏名* */ / 对语句:对语句: printf(%f,S); printf(%f,S); 在宏交换后变为:在宏交换后变为: printf(%f,3.1415926 printf(%f,3.1415926* *y y* *y);y); 8.1 宏定义宏定义112022-5-5 C C程序设计教程程序设计教程 - - http:/ 6习惯上宏名用大写字母表示,以便于与变量区别。但习惯上宏名用大写字母表示,以便于与变量区别。但也允许用小写字母。也允许用小写字母。 7 7可用宏定义表示数据类型,使书写方便。

10、可用宏定义表示数据类型,使书写方便。 例如:例如: #define INT int #define INT int 在程序中可用在程序中可用INTINT作变量阐明:作变量阐明: INT a10, body5; INT a10, body5; 8 8假设对输出格式进展宏定义,可以减少程序中反复假设对输出格式进展宏定义,可以减少程序中反复书写某些字符串的任务量,而对程序结果没有影响。运用宏书写某些字符串的任务量,而对程序结果没有影响。运用宏定义,还可以提高程序的通用性。定义,还可以提高程序的通用性。122022-5-5 C C程序设计教程程序设计教程 - - http:/ 对输出格式进展宏定义。对

11、输出格式进展宏定义。#define PR printf#define PR printf#define D %d #define D %d #define F %fn#define F %fn#include #include void main()void main() int a=012, c=-8, e=11; int a=012, c=-8, e=11; float b=3.8, d=9.7, f=21.08; float b=3.8, d=9.7, f=21.08; PR(D F,a,b); PR(D F,a,b); PR(D F,c,d); PR(D F,c,d); PR(D F,

12、e,f); PR(D F,e,f);程序运转结果:程序运转结果:10 3.80000010 3.800000-8 9.700000-8 9.70000011 21.00000011 21.000000 留意:宏定义是专门用于预处置命令的一留意:宏定义是专门用于预处置命令的一个公用名词,它与定义变量的含义不同,只作个公用名词,它与定义变量的含义不同,只作字符交换,不分配内存空间。字符交换,不分配内存空间。132022-5-5 C C程序设计教程程序设计教程 - - http:/ N(x,y) 3#define N(x,y) 3* *x+yx+y* *y /y /* *带参的宏定义带参的宏定义*

13、*/ / k=N(7 k=N(7,9); 9); / /* *经预处置宏展开后的语句为:经预处置宏展开后的语句为:k= 3k= 3* *7+97+9* *9 9;* */ /9.1.2 9.1.2 带参数的宏定义带参数的宏定义 1. 1. 带参宏定义的普通方式带参宏定义的普通方式 带参宏定义的普通方式为:带参宏定义的普通方式为: #define #define 宏名宏名( (形参表形参表) ) 字符串字符串 调用带参宏定义的普通方式为:调用带参宏定义的普通方式为: 宏名宏名( (实参表实参表) ); 142022-5-5 C C程序设计教程程序设计教程 - - http:/ 带参的宏定义例如。

14、带参的宏定义例如。#include #include #define MAX(a,b) (ab)?a:b#define MAX(a,b) (ab)?a:bvoid main()void main() int x,y,max; int x,y,max; printf(input two numbers:); printf(input two numbers:); scanf(%d%d,&x,&y); scanf(%d%d,&x,&y); max=MAX(x,y); max=MAX(x,y); printf(max=%dn,max); printf(max=%dn,

15、max);程序运转结果:程序运转结果:input two numbers: 23 8input two numbers: 23 8 max=23max=23max=MAX(x,y) max=MAX(x,y) ,实参,实参x x、y y将交换形参将交换形参a a、b b。宏展开后该语句为:宏展开后该语句为:max=(xy)?x:y;max=(xy)?x:y;152022-5-5 C C程序设计教程程序设计教程 - - http:/ 2. 运用带参宏定义的几点阐明运用带参宏定义的几点阐明 对于带参的宏定义有以下问题需求阐明:对于带参的宏定义有以下问题需求阐明:1 1带参宏定义中,宏名和形参表之间不

16、能有空格出现。带参宏定义中,宏名和形参表之间不能有空格出现。 例如:例如: #define MAX(a,b) (ab)?a:b #define MAX(a,b) (ab)?a:b 写为:写为:#define MAX (a,b) (ab)?a:b#define MAX (a,b) (ab)?a:b2 2在宏定义中的形参是标识符,而宏调用中的实参可以在宏定义中的形参是标识符,而宏调用中的实参可以是表达式。是表达式。162022-5-5 C C程序设计教程程序设计教程 - - http:/ 带参的宏定义中形参和实参的交换。带参的宏定义中形参和实参的交换。#include #include #defi

17、ne S1(y) (y)#define S1(y) (y)* *(y)(y)void main()void main() int a,sq; int a,sq; printf(input a number: ); printf(input a number: ); scanf(%d,&a); scanf(%d,&a); sq=S1(a+1); sq=S1(a+1); printf(sq=%dn,sq); printf(sq=%dn,sq); 程序运转结果:程序运转结果:input a number: 6 input a number: 6 sq=49sq=49172022-5-

18、5 C C程序设计教程程序设计教程 - - http:/ 8.1 宏定义宏定义3 3在宏定义中,字符串内的形参通常要用括号括起来以在宏定义中,字符串内的形参通常要用括号括起来以防止出错。防止出错。P208P2084 4带参宏定义可用来定义多个语句,在宏调用时,把这些带参宏定义可用来定义多个语句,在宏调用时,把这些语句又交换到源程序内。语句又交换到源程序内。 例例9.49.4带参宏定义可用来定义多个语句。带参宏定义可用来定义多个语句。182022-5-5 C C程序设计教程程序设计教程 - - http:/ n#define PI 3.1415926n#define CIRCLE(R,L,S,V

19、) L=2*PI*R;S=PI*R*R;V=4.0/3.0*PI*R*R*Rn void main()n float r,l,s,v;n scanf(%f,&r);n CIRCLE(r,l,s,v);n printf(r=%6.2f,l=%6.2f,s=%6.2f,v=%6.2fn,r,l,s,v);n void main() float r,l,s,v; scanf(%f,&r); l=2* 3.1415926 *r; s= 3.1415926 *r*r; v=4.0/3.0* 3.1415926 *r*r*r; printf(r=%6.2f,l=%6.2f,s=%6.2f,

20、v=%6.2fn,r,l,s,v); 192022-5-5 C C程序设计教程程序设计教程 - - http:/ 3. 带参宏定义与函数的区别带参宏定义与函数的区别 (1) (1) 函数调用时,先求出实参表达式的值,然后代入形参。函数调用时,先求出实参表达式的值,然后代入形参。而运用带参的宏只是进展简单的字符交换。而运用带参的宏只是进展简单的字符交换。 (2) (2) 函数调用是在程序运转时处置的,为形参分配暂时的内函数调用是在程序运转时处置的,为形参分配暂时的内存单元。而宏展开那么是在编译前进展的,在展开时并不分配存单元。而宏展开那么是在编译前进展的,在展开时并不分配内存单元,不进展值的传送

21、处置,也没有内存单元,不进展值的传送处置,也没有“前往值的概念。前往值的概念。 (3) (3) 对函数中的实参和形参类型要求一致。而宏名无类型,对函数中的实参和形参类型要求一致。而宏名无类型,它的参数也无类型,只是一个符号代表,展开时代入指定的字它的参数也无类型,只是一个符号代表,展开时代入指定的字符串即可。宏定义时,字符串可以是任何类型的数据。符串即可。宏定义时,字符串可以是任何类型的数据。 (4) (4) 调用函数只可得到一个前往值,而用宏可以设法得到几调用函数只可得到一个前往值,而用宏可以设法得到几个结果。个结果。( (例例9.4 )9.4 )202022-5-5 C C程序设计教程程序

22、设计教程 - - http:/ 阐明:阐明: 假设擅长利用宏定义,可以实现程序的简化,假设擅长利用宏定义,可以实现程序的简化,如事先将程序中的如事先将程序中的“输出格式定义好,以减少在输出语输出格式定义好,以减少在输出语句中每次都要写出详细的输出格式的费事。句中每次都要写出详细的输出格式的费事。 (5) (5) 运用宏次数多时,宏展开后源程序长,由于每展开一运用宏次数多时,宏展开后源程序长,由于每展开一次都使程序增长,而函数调用不会使源程序变长。次都使程序增长,而函数调用不会使源程序变长。 (6) (6) 宏交换不占运转时间,只占编译时间。而函数调用那宏交换不占运转时间,只占编译时间。而函数调

23、用那么占运转时间分配单元、保管现场、值传送、前往。么占运转时间分配单元、保管现场、值传送、前往。212022-5-5 C C程序设计教程程序设计教程 - - http:/ 文件包含文件包含 所谓所谓“文件包含处置是指一个源文件可以将另外一个源文件文件包含处置是指一个源文件可以将另外一个源文件的全部内容包含进来,即将另外的文件包含到本文件之中。的全部内容包含进来,即将另外的文件包含到本文件之中。 普通方式:普通方式:#include #include “文件名文件名 或:或: #include #include 例如:在前面运用输入输出函数和数学函数的头文件时,已例如:在前面运用输入输出函数和数

24、学函数的头文件时,已多次用到的文件包含命令:多次用到的文件包含命令: #include #include #include #include 222022-5-5 C C程序设计教程程序设计教程 - - http:/ 文件包含文件包含如下图如下图留意:留意: 在编译时并不是分别对两个文件分别进展编译,然后在编译时并不是分别对两个文件分别进展编译,然后再将它们的目的程序衔接的,而是在经过编译预处置后将头再将它们的目的程序衔接的,而是在经过编译预处置后将头文件文件file2.cfile2.c包含到主文件中,得到一个新的源程序,然后对包含到主文件中,得到一个新的源程序,然后对这个文件进展编译,得到一

25、个目的这个文件进展编译,得到一个目的.obj.obj文件。被包含的文件。被包含的文件成为新的源文件的一部分,而单独生成目的文件。文件成为新的源文件的一部分,而单独生成目的文件。232022-5-5 C C程序设计教程程序设计教程 - - http:/ 文件包含文件包含对文件包含命令还要阐明以下几点:对文件包含命令还要阐明以下几点:1 1包含命令中的文件名可以用双引号括起来:包含命令中的文件名可以用双引号括起来: 运用尖括号如运用尖括号如方式时,系统到存放方式时,系统到存放C C库函库函数头文件的目录中寻觅要包含的文件,这称为规范方式。头数头文件的目录中寻觅要包含的文件,这称为规范方式。头文件的

26、包含目录是由用户在设置环境时设置的。文件的包含目录是由用户在设置环境时设置的。 运用双引号即运用双引号即“stdio.hstdio.h方式时,系统先在用户当方式时,系统先在用户当前目录中寻觅要包含的文件,假设找不到,再按规范方式查前目录中寻觅要包含的文件,假设找不到,再按规范方式查找。用户编程时可根据本人文件所在的目录来选择某一种命找。用户编程时可根据本人文件所在的目录来选择某一种命令方式。令方式。242022-5-5 C C程序设计教程程序设计教程 - - http:/ 文件包含文件包含2 2一个一个includeinclude命令只能指定一个被包含文件,假设命令只能指定一个被包含文件,假设

27、有多个文件要包含,那么需用多个有多个文件要包含,那么需用多个includeinclude命令。命令。3 3文件包含允许嵌套,即在一个被包含的文件中又可文件包含允许嵌套,即在一个被包含的文件中又可以包含另一个文件。以包含另一个文件。 留意:在程序设计过程中,文件包含不能构成循环嵌留意:在程序设计过程中,文件包含不能构成循环嵌套。套。252022-5-5 C C程序设计教程程序设计教程 - - http:/ 3种方式:种方式:(1)(1)ifdef ifdef 标识符标识符 程序段程序段elseelse 程序段程序段endifendif(2)(2)ifndef ifndef 标识符标识符 程序段程

28、序段elseelse 程序段程序段endifendif(3) (3) if if 表达式表达式 程序段程序段elseelse 程序段程序段endifendif 9.3 条件编译条件编译 262022-5-5 C C程序设计教程程序设计教程 - - http:/ 9.3 条件编译条件编译 #include stdio.h #include stdio.h #define TED 10 #define TED 10 void main () void main () #ifdef TED #ifdef TED printf(Hello Tedn); / printf(Hello Tedn); /* * 假设定义了假设定义了TEDTED,那么编译此行代码,那么编译此行代码 * */ / #else #else printf(Hello anyonen);/ printf(Hello anyonen);/* * 假设没用定义假设没

温馨提示

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

评论

0/150

提交评论