谭浩强C程序设计(第三版)清华第9章_预处理课件_第1页
谭浩强C程序设计(第三版)清华第9章_预处理课件_第2页
谭浩强C程序设计(第三版)清华第9章_预处理课件_第3页
谭浩强C程序设计(第三版)清华第9章_预处理课件_第4页
谭浩强C程序设计(第三版)清华第9章_预处理课件_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

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

文档简介

1、,第9章,预处理命令,1,学习通信PPT,本章要点,使用预处理概念C语言处理系统的预处理功能预处理命令,2,学习通信PPT,主要内容,包括9.1宏定义9.2“文件”处理9.3条件编译,3,学习AC这些预处理命令由ANSI C统一规定,但不是C语言本身的一部分,编译程序无法识别,因此无法直接编译。通常,在编译程序之前,需要在程序中“预处理”这些特殊命令。预处理后,程序通常编译预处理源代码,以获得可执行的目标代码。4,学习通信PPT、基本概念、c语言与其他高级语言的重要区别在于可以使用预处理命令和预处理功能。提供的预处理功能主要有三种:宏定义文件包含条件编译。这些功能分别通过宏定义命令、文件包含命

2、令和条件编译命令来实现。这些命令以符号开头,以区别于普通语句。范例:#define #include,5,学习通讯PPT,9.1巨集定义,9.1.1.1没有参数的巨集定义,巨集定义的一般形式为:define识别码字串如下:define PI 3.1415926,宏定义的目的是在此程序文件中使用指定的标识符PI,而不是字符串“3.1415926”,编译预处理时,程序中出现在该命令之后的所有PI都将替换为“3.1415926”。使用此方法,用户可以用简单的名称替换长字符串。此标识符(名称)称为宏名称。预编译时将宏重命名为字符串的过程称为宏放置。Define是宏定义命令。6,学习通信PPT,# in

3、clude # define pi 3.1415926 void main()float l,s,r,v;printf(input radius :);Scanf(%f,示例9.1使用不带参数的宏定义。7、学习通信PPT、input radius: 4,工作方式如下:1=25.1328s=50.2655v=150.7966,(1)巨集名称通常以大写字母显示,以区别于变数名称。但是,这不是规定,也可以用小写。(2)使用宏名而不是一个字符串,可以减少程序重复编写特定字符串的工作量。(3)宏定义将字符串替换为宏名称,只进行简单替换,不进行正确性检查。只有在编译宏部署的源程序时,才会检测到语法错误并报

4、告错误。说明:8,学习通信PPT,(4)宏定义不是语句,无需在行尾添加编号。添加分号将替换为分号。(5) define命令出现在程序中的函数外部,宏名的有效范围是定义命令后在源文件中结束。通常,define命令记录在文件的开头,并且作为函数之前文件的一部分在此文件范围内有效。(6)您可以使用undef指令结束巨集定义的范围。示例:说明:9,学习通信PPT,# define g 9.8 _ _ _ _ _ _ _ void main()g的有效范围- # undefig f1()这提供了对宏定义范围的灵活控制。10,学习通信PPT,(7)在执行宏定义时,可以引用定义的宏名称,可以按层替换。说明:

5、# include # define r 3.0 # define pi 3.1415926 # define l 2 * pi * r # define s pi * r * r void main(),l=18.849556s=28.27333,范例9.2参考巨集定义中定义的巨集名称。11,学习AC PPT,如果宏展开,则printf函数的输出项将展开为: 2*3.1415926*3.0,3.1415926*3.0*3.0 printf函数调用语句为:printf (l=%,12,学习通信PPT,(8)程序不替换用双撇号括起来的字符串中的字符,即使它们与宏名称相同。(9)宏定义是预处理命令

6、专用名词,与定义变量不同,它只是用文字替换,不分配内存空间。,说明:13,学习通信PPT,具有9.1.2参数的宏定义,角色:替换参数,而不是简单的字符串替换。具有参数的巨集定义通常为:define巨集名称(参数表)字串内括号中指定的参数,#define S(a,b) a*b area=S(3,2);程序分别使用和代替宏定义中的表单参数和b,使用*代替S(3,2)。因此,赋值语句将从左到右替换为area=3*2,例如,14,学习通信PPT,具有实际参数的宏(例如S(3,2),define命令行中指定的字符串)。如果宏在字符串中包含形参数(例如a、b),程序将使用该实际参数(可以是常量、变量或表达

7、式)代替形参数。如果巨集定义的字串中的文字不是参数文字(例如*的*号码),则会保持不变。这将形成重新定位的字符串。的宏定义替换为:15,学习通信PPT,# include # define pi 3.1415926 # define s(r)pi * r * r void main()FLLA=3.6area=S(a);Printf(r=%fnarea=%fn,a,area);3.600000area=40.715038,示例9.3使用参数宏,展开指定语句“area=S(a)”宏,然后area=3.1415926 * *;如果您展开具有参数、16、学习通讯PPT、(1)的巨集,则会在陈述式的巨

8、集名称后显示实际参数字串(在括号中),而不是define指令行的造型。(2)定义宏时,不要在宏名称和带有参数的括号之间放置空格。否则,空格后的字符将作为替换字符串的一部分包含。说明:17,学习交换PPT,(1)调用函数时,首先获取实际表达式值,然后改用几何参数。使用带有参数的宏是简单的字符替换。(2)函数调用在程序运行时处理,并将临时内存设备分配给几何参数。宏的放置是在编译之前完成的,在放置时不分配内存单位,也不传递值或具有返回值的概念。(3)函数的实际参数和几何参数类型的要求相同。宏名称没有类型,参数也没有类型,只是可以使用指定字符串扩展时代的符号表示法。定义宏时,字符串可以是任何类型的数据

9、。(4)调用函数只能得到一个返回值,使用宏可以得到一些结果。带参数的宏和函数之间的差异:18,学习通信PPT,# include # define pi 3.1415926 # define circle(r,l,s,v)l=2 * PPTS=PI * R * Rv=4.0/3.0 * pi * r * r void main()floatr,l,s,v;Scanf(%f,示例9.4通过扩展宏获得了多种结果。19,学习通信PPT,void main() float r,l,s,v;Scanf(%f),预编译宏,扩展的main函数如下:3.5 r=3.50,l=21.99,s=38.48,v=1

10、79.59,20,学习AC PPT,(5)多次使用宏,每个批处理的程序都会变大,因此函数调用不会导致源程序变长。(6)宏替换不占用执行时间,只占用编译时间。函数调用表示执行时间:分配单位、调度字段、值传递、返回。具有参数的宏和函数之间的差异:如果充分利用宏定义,可以简化程序(例如预定义程序的“输出格式”),从而减少在输出语句中每次创建特定输出格式的工作量。21、学习通信PPT,通过示例9.5宏获得了多种结果。# include # define pr printf # define nl n # define d % d # define D1 d nl # define D2 d nl #

11、define D3 d d nl # define DDChar string=CHINAa=1;b=2;c=3;d=4;PR(D1,a);PR(D2、a、b);PR(D3、a、b、c);PR(D4、a、b、c、d);PR(S,string);运行时输出结果:22、学习通信PPT、“包含文件”处理意味着一个源文件可以包含其他源文件的全部内容。语言提供了#include命令用于实现“包含文件”的任务。通常创建: #include文件名或#include,9.2“包含文件”处理,23,学习通信PPT,示例9.6示例95小时格式宏作为头文件,并将其包含在用户程序中。,(1)格式宏位于头文件forma

12、t . h # include # Define pr printf # Define nl n # Define d % d # Define D1 d nl # Define D2 d nl # DefineChar string=CHINAa=1;b=2;c=3;d=4;PR(D1,a);PR(D2、a、b);PR(D3、a、b、c);PR(D4、a、b、c、d);PR(S,string);24,学习AC PPT,注意:编译时,不要单独编译这两个文件,然后链接目标程序,而是将编译前前导文件format.h包含在主文件中,获取新的源程序,然后编译此文件以指向目标(.obj)文件。包含的文件

13、成为新源文件的一部分,目标文件单独生成。25,学习通信PPT,(1)一个#include命令只能指定一个包含文件,要包含个文件,请使用#include命令。(2)如果文件包含文件,并且您要在文件中使用文件的内容,则可以使用两个include命令将文件和文件包含在文件中。文件必须出现在文件前面。也就是说,必须在中定义。(3)一个包含文件可以包含其他包含文件。也就是说,嵌入文件可以嵌套。说明:26,学习通信PPT,27,学习通信PPT,(4)文件名可以在#include命令中用双撇号或尖括号括起来。(5)嵌入的文件()和嵌入的文件(立即#include命令的源文件)在预编译后将成为同一文件(而不是两个文件)。因此,如果具有全局静态变量,则此变量在文件中也有效,并且无需声明为extern。说明:28,学习通信PPT,9。条件编译,概念:所谓“条件编译”,是指定某些内容的编译条件,以便仅在满足某些条件时进行编译。条件编译命令的几种形式:(1)ifdef标识符

温馨提示

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

评论

0/150

提交评论