C C++语言程序设计(西电版)第7章 编译预处理.ppt_第1页
C C++语言程序设计(西电版)第7章 编译预处理.ppt_第2页
C C++语言程序设计(西电版)第7章 编译预处理.ppt_第3页
C C++语言程序设计(西电版)第7章 编译预处理.ppt_第4页
C C++语言程序设计(西电版)第7章 编译预处理.ppt_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

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

文档简介

第七章编译预处理,C/C+语言程序设计,龚尚福,贾澎涛主编C/C+语言程序设计西安电子科技大学出版社,2,第7章编译预处理,7.1宏定义7.2文件包含7.3条件编译7.4小结,3,编译预处理(续),C语言对源程序在正常编译(包括词法分析、语法分析、代码生成和代码优化)之前先执行源程序中的预处理命令。预处理后,源程序再被正常编译,以得到目标代码(OBJ文件)。,4,编译预处理(续),编译预处理命令不属于C语言语句的范畴,所使用的命令单词也不是C语言的保留字,在程序中书写时后边不加语句结束符“;”,但是前边要加一个符号“#”。在C语言源程序中,凡是前边加有“#”号的行都是预处理命令。如果一行书写不下,可用反斜线“”和回车键来结束本行,然后在下一行继续书写。,5,7.1宏定义,用一个标识符来表示一个字符串,称为“宏”。被定义为“宏”的标识符称为“宏名”。在编译预处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去代换,称为“宏代换”或“宏展开”。宏定义是由源程序中的宏定义命令完成的。宏代换是由预处理程序自动完成的。C语言中,“宏”分为有参宏和无参宏两种。,6,无参宏的宏名后不带参数。命令的一般格式:,7.1.1无参宏,7.1宏定义(续),“标识符”为所定义的宏名,它的写法同标识符,也叫符号常量,一般用大写字母表示。“字符串”用来表示标识符被定义的内容,它通常是常数、表达式、格式串等。,#define标识符字符串,7,无参宏,例如:,替换,3.14,3.14,#definePI3.14main()floatr,s,c;scanf(“%f”,8,7.1宏定义(续),说明:(1)在使用宏定义命令定义符号常量时,通常宏名使用大写字母,以便与变量区别。这是一种习惯,当然宏名用小写字母也不会出现语法错误。(2)预处理程序对符号常量的处理只是进行简单的替换工作,不作语法检查,如果程序中使用的预处理语句有错,只能在正式的编译阶段检查出来。,9,7.1宏定义(续),(3)宏定义不是语句,在行末不必加分号,如加上分号则连分号也一起置换。(4)宏定义可以嵌套,即就是在一个宏定义命令中可以使用已被定义的宏名作为其字符串。宏替换时就要从后向前逐层替换。例如:#defineWIDTH2#defineLENGTH(WIDTH+3)#defineAREA(LENGTH*WIDTH),10,7.1宏定义(续),(5)对于加有双引号的字符串中出现的宏名不进行替换。例如:#defineTWO2*nintn=8;printf(TWO=%dn,TWO);运行该程序后,输出结果为:TWO=16,11,7.1宏定义(续),(6)宏名的作用域为定义该宏名的文件,即宏名的作用域是文件级的,从定义时起到文件结束为止。如果有终止宏名命令,则其作用域到终止宏名命令为止。终止宏名命令的格式为:(7)宏定义时必须注意字符串部分的书写,保证在宏代换之后与原题意相符。例如:#defineM(y*y+3*y),#undef标识符,12,命令的一般形式:,7.1.2带参宏定义,在宏定义中的参数称为形参,在宏调用中的参数称为实参。“宏名”同标识符,习惯采用大写字母;“形参表”由一个或多个参数组成,多个参数之间用逗号分隔,说明参数时不加类型说明;“字符串”中包含了“形参表”中所指定的参数,它可以由若干条语句组成。,例如:#defineMAX(X,Y)(X)(Y)?(X):(Y),7.1宏定义(续),#define宏名(形参表)字符串,13,带参宏调用的一般形式为:,7.1.2带参宏定义,带参数的宏定义命令进行宏替换时,不是简单地用“字符串”来替换“宏名”,而是使用“实参”来代换“形参”,其余部分保持不变。,7.1宏定义(续),宏名(实参表),14,7.1宏定义(续),说明:(1)带参宏定义中,宏名和形参表之间不能有空格出现,否则将空格符后边的内容都作为字符串,成为不带参数的宏定义语句了。例如:#defineADD(x,y)(x)+(y)(2)宏代换中的实参一般常为常量、变量或表达式。在宏展开后容易引起误解的表达式,在宏定义时,应将表达式用圆括号括起来,形式参数两边也应加括号。例如:#defineSQ(x)x*x,15,7.1宏定义(续),(3)在带参数宏定义中,也可以引用已定义过的宏定义。例如:#definePI3.1415926#defineS(r)PI*r*r#defineV(r)3.0/4*S(r)*r,16,7.2文件包含,命令的一般形式:格式1:格式2:,文件包含是指可以在一个源文件中包含另一个源文件的全部内容,使之成为本文件自身的一部分。用include命令实现。,用格式1,指示编译系统在系统设定的标准子目录include中查找被包含的文件。如果在标准子目录中不存在指定的文件,编译系统会发出错误信息,并停止编译过程。用格式2,编译系统首先在源程序所在的目录中查找,如果没有,再到系统设定的标准子目录include中查找。,#include,#include文件名,17,7.2文件包含(续),说明:(1)在编译预处理时,文件包含命令行由被包含文件的内容替换,成为源程序文件内容的一部分,与其他源程序代码一起参加编译。,18,7.2文件包含(续),(2)一个#include命令只能指定一个被包含的文件,若要包含多个文件,必须使用相应多个#include命令。例如:#include#include#include下列的文件包含命令是错误的:#include,19,7.2文件包含(续),(3)文件包含可以嵌套,即在一个被包含文件中还可以包含另外的被包含文件。例如:源文件file.c中有文件包含命令#include,而文件file1.h又包含了文件file2.h。相当于在文件file.c中有下列文件包含命令行:#include#include,20,7.3条件编译,有时可能希望程序的某部分在满足一定的条件下进行编译,或者在满足一定的条件下不进行编译,这就是条件编译。条件编译可以产生不同的目标代码文件,使生成的目标程序较短,从而减少了内存的开销并提高了程序的效率,这对于程序的移植和调试是很有用的。,21,7.3条件编译(续),1.条件编译命令的格式,有以下三种形式:(1)#ifdef标识符程序段1#else程序段2#endif功能:如果标识符已被#define命令定义过,则对程序段1进行编译;否则对程序段2进行编译。,22,7.3条件编译(续),如果没有程序段2(为空),本格式中的#else可以没有,即可以写为:#ifdef标识符程序段#endif功能:当“标识符”中的宏名被定义时,“程序段”中内容参加编译,否则“程序段”内容不参加编译。,23,7.3条件编译(续),(2)#ifndef标识符程序段1#else程序段2#endif功能:如果标识符未被#define命令定义过,则对程序段1进行编译,否则对程序段2进行编译。这与第一种形式的功能正好相反。,24,7.3条件编译(续),(3)#if常量表达式程序段1#else程序段2#endif功能:如果常量表达式的值为真(非“0”),则对程序段1进行编译,否则对程序段2进行编译。因此可以使程序在不同条件下,完成不同的功能。其中的表达式必须为常量表达式,在表达式中不能包含变量。,25,7.3条件编译(续),2.条件编译命令的应用(1)条件编译命令可以给程序调试带来方便(2)条件编译命令可以使一个源程序生成不同的目标代码(3)使用条件编译命令替代if语句会减少目标代码的长度,26,7.4小结,本章介绍了宏定义、文件包含和条件编译三种编译预处理。编译预处理功能是C语言特有的功能,也是C语言与其他高级语言的重

温馨提示

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

评论

0/150

提交评论