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

下载本文档

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

文档简介

1、第9章,预处理指令,本章要点,预处理概念c语言处理系统的预处理功能预处理指令的使用,主要内容,9.1宏定义9.2“包含文件”处理9.3条件编译,基本概念,ANSI C标准规定,在c源程序中添加“预处理指令”,编程虽然这些预处理命令是由ANSI C统一的,但它不是c语言本身的一部分,编译器无法识别,因此无法直接编译。 在通常编译程序之前,必须对程序中的这些特殊命令进行“预处理”。 预处理的程序可以对编译器预处理的源程序通常进行编译处理,以获得可执行的目标代码。 基本概念、c语言和其他高级语言的一个重要区别是可以使用预处理命令和预处理功能。 c提供的预处理功能主要通过1 .宏定义2 .文件3 .条

2、件编译这些功能用宏定义指令、文件指令、条件编译指令实现。 为了与普通c语句区别开来,这些命令以符号“#”开头。 例如: #define #include,9.1宏定义,没有9.1.1参数的宏定义,宏定义的一般形式为:#define识别符字符串示例: # define PI 3.1415926。 宏定义用指定的标识符PI替换程序文件中的字符串“3.1415926”,并用“3.1415926”替换在编译预处理时在程序中出现在该指令之后的所有PI。 这个方法可以用简单的名称替换长字符串。 该标识符(名称)称为“宏名”。 在预编译时用字符串替换宏名称的过程称为“宏展开”。 #define是宏定义命令。

3、 包含#定义pi 3.1415926语音主() 浮点,s,r,v; 打印(输入radius : ); scanf(%f”,示例9.1使用了没有参数的宏定义。 input radius :22222卡卡卡卡卡卡卡卡卡卡卡卡卡卡卡卡卡卡卡卡卡卡6,但这不是规定,也可以小写。 (2)通过用宏名代替字符串,可以减少程序反复写入特定字符串的工夫。 (3)宏定义使用宏名代替字符串,只进行简单的置换,不进行正确性检查。 只有在编译宏展开的源程序时,才会检测语法错误和错误。 说明:(4)宏定义不是c句,没有必要在行末加分。 如果加分号,则与分号一起被替换。 (5) #define命令出现在程序中的函数外,宏名

4、的有效范围是到定义命令后本源文件结束为止。 通常,#define命令出现在文件的开头,在函数之前,作为文件的一部分在该文件范围内有效。 (6)宏定义的范围可以用#undef命令结束。 例如:# defineg 9.8 _ _ _ _ _ _ void main ()上箭头 g的有效范围- # undef1 () ,在f1函数中g不表示9.8。 这可以灵活地控制宏定义的作用范围。 (7)在进行宏定义时,可以引用定义的宏名,并进行分层置换。 说明:# include # definer 3.0 # define pi 3.1415926 # define L2 * pi * r # define

5、sspi * r * void main () printf ( l=% fns=% fn ,l,s ); ,行为如下: L=18.849556 S=28.274333,参照例9.2宏定义中定义的宏名称。 宏展开后,printf函数的输出项目l展开为: 2*3.1415926*3.0 S,3.1415926*3.0*3.0 printf函数调用语句展开为:printf(“L=%FNS=%fn”,2 * 3.141 (8)程序中用双重撇号围起来的字符串内的字符即使与宏名相同也不会被置换。 (9)宏定义是前处理指令专用的专业术语,与定义变量的意义不同,只替换字符,不分配存储器空间。 说明:9.1.

6、2带参数的宏定义,作用:进行参数替换,而不是简单的字符串替换。带参数的宏定义的一般形式为:#define宏名(参数表)字符串中包含括号中指定的参数,#define S(a,b ) a * barea=s (3,2 ); 将程序中宏定义中的形式参数a和b替换为3和2,将s (3,2 )替换为3*2。 赋值语句展开为具有area=3*2,例如,实际参数的宏(例如s (3,2 ) ),并从左到右替换在#define命令行中指定的字符串。 如果字符串包含宏中的形状参数(a、b等),则将程序中的相应实际参数(常数、变量、表达式等)替换为形状参数。 如果宏定义的字符串中的字符不是参数字符(如a*b的*符号

7、),则保留。 这将形成被替换的字符串。 参数宏定义包括: # include # define pi 3.1415926 # defines (r ) pi * r * void main () float,area; a=3.6; area=s (a )打印机( r=% fnarea=% fn ,a,area ); ,执行情况如下:使用r=3.600000 area=40.715038、例9.3带参照的宏,使用代入语句“area=S(a ); 宏展开后,area=3.1415926*a*a; (1)展开带参数的宏时,将使用语句宏名称后用括号括起来的实际参数字符串,而不是#define命令行的

8、形状参数。 (2)宏定义时,请不要在宏名称和带参数的括号之间加入空格。 否则,空格之后的字符就成为替代字符串的一部分。 说明:(1)函数调用时,首先求出实参数式的值,代入形参数。 只有简单的字符替换使用带引用的宏。 (2)函数调用在程序执行时处理,为波形参数分配临时的存储单元。 宏展开在编译前进行,展开时不分配存储单元,也不进行值的传递处理,也没有“返回值”的概念。 (3)函数中对实参和形参类型的要求一致。 宏名没有类型,其参数也没有类型,只要用一个符号表示,展开时代进入指定的字符串即可。 对于宏定义,字符串可以是任何类型的数据。 (4)调用函数只能得到一个返回值,但是在宏中可以得到一些结果。

9、 参数宏和函数的差异:# include # define pi 3.1415926 # define circle (r,l,s,V) L=2*PI*R; S=PI*R*R; v=4.0/3.0 * pi * r *语音主() 浮动、l、s、v; scanf(%f”,例9.4宏展开得到了一些结果。 void main () 浮点r,l,s,v; scanf(%f”,预编译宏,展开的main函数执行如下操作:3.5?r=3.50,l=21.99,s=38.48,v=179.59,(5)如果宏次数多,则宏展开后源程序(6)宏置换不占用执行时间,只占用编译时间。 函数调用占执行时间(分配单元、预约

10、现场、传递值、返回)。 带参数的宏和函数的区别:如果能很好地利用宏定义,则可以预先定义程序中的“输出格式”等,实现程序的简化,减少每次在输出语句中写入具体的输出格式的时间。 例9.5宏观展开得到了一些结果。# include # defineprintf # definenl n # defined % d # defined1dnl # defined2dnl # defined 3d nl # defined 4d nl # defines % s ,void ma char string=CHINA ; a=1; b=2; c=3; d=4; PR(D1,a) PR(D2,a,b) PR

11、(D3,a,b,c) PR(D4,a,b,c,d) PR(S,串) ,运行时输出结果:1,1231234 China,“包含文件”处理是指某个源文件在c语言中,可以使用#include命令“包括文件”。 其通用格式为: #include文件名或# include,9.2“包含文件”处理,示例9.6将示例9.5的格式宏作为报头文件,并将其包含在用户程序中。(1)格式化宏的头文件format.h # include # defineprintf # definenl 1n # defined % d # defined1dnl # defined2dnl # defined 3d nl # def

12、ined char string=CHINA ; a=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) ,注意:编译时,不是分别编译两个文件并连接到目标程序,而是在进行了编译预处理后,将头文件format.h包含在主文件中,获取新的源程序,并在此包含的文件将成为新源文件的一部分,而目标文件将单独生成。 可以用1个#include命令指定要包含的文件。 如果要包含n个文件,请使用n个#include命令。 (2)如果文件1包含文件2,文件2需要文件3的内容,则文件1可以使用两个include命令包含文件2和文件3,文件3必须在文件2之前,即在文件1.c中定义。 (3)一个包含文件可以包含另一个包含文件,即,文件的包含可以嵌套。 说明:(4)文件名可以用#include命令用双撇号或尖括号括起来。 (5)所包括的文件(file2.h )及其文件(#include命令的源文件2.c )在编译之前是相同的文件(不是两个文件)。 因此,如果file2.h具有全局静态变量,则在file1.h文件中也有效,不需要在extern中声明。 说明:9.3条件编译,概念:“条件编译”是指为某些内容指定编译条件,使其仅在满足特定条件时才进行编译。 条件编译命令的几种形式:(1)

温馨提示

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

评论

0/150

提交评论