《最新c c++语言程序设计(西电版第7章 编译预处理(共27张ppt课件).pptx》由会员分享,可在线阅读,更多相关《最新c c++语言程序设计(西电版第7章 编译预处理(共27张ppt课件).pptx(27页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第七章第七章 编译编译(biny)(biny)预处理预处理C/C+C/C+语言语言(yyn)(yyn)程序设计程序设计第一页,共二十七页。27.1 宏定义宏定义7.2 文件包含文件包含(bohn)7.3 条件编译条件编译7.4小结小结第二页,共二十七页。3 C C语言语言(yyn)(yyn)对源程序在正常编译(包括词法对源程序在正常编译(包括词法分析、语法分析、代码生成和代码优化)之前分析、语法分析、代码生成和代码优化)之前先执行源程序中的预处理命令。预处理后,源先执行源程序中的预处理命令。预处理后,源程序再被正常编译,以得到目标代码(程序再被正常编译,以得到目标代码(OBJOBJ文文件)。件
2、)。第三页,共二十七页。4第四页,共二十七页。5第五页,共二十七页。6无参宏的宏名后不带参数。命令无参宏的宏名后不带参数。命令(mng lng)(mng lng)的一般格式:的一般格式:# #define define 标识符标识符 字符串字符串第六页,共二十七页。7例如例如(lr)(lr):替替换换#define PI 3.14main() float r,s,c; scanf(“%f”,&r); s = r * r * PI; c = 2 * r * PI; printf(“s=%f, c=%f”,s,c);第七页,共二十七页。说明说明:(1)在使用宏定义命令定义符号常量时,)在使用宏定义
3、命令定义符号常量时,通常宏名使用大写字母,以便与变量区别通常宏名使用大写字母,以便与变量区别。这是一种习惯,当然宏名用小写字母也。这是一种习惯,当然宏名用小写字母也不会出现语法错误。不会出现语法错误。(2)预处理程序对符号常量的处理只是进)预处理程序对符号常量的处理只是进行简单的替换工作行简单的替换工作(gngzu),不作语法检查,不作语法检查,如果程序中使用的预处理语句有错,只能如果程序中使用的预处理语句有错,只能在正式的编译阶段检查出来。在正式的编译阶段检查出来。8第八页,共二十七页。(3)宏定义不是语句,在行末不必加分号,如)宏定义不是语句,在行末不必加分号,如加上分号则连分号也一起置换
4、。加上分号则连分号也一起置换。(4)宏定义可以嵌套,即就是在一个宏定义命)宏定义可以嵌套,即就是在一个宏定义命令中可以使用已被定义的宏名作为其字符串。令中可以使用已被定义的宏名作为其字符串。宏替换时就要从后向前宏替换时就要从后向前(xin qin)逐层替换。例如:逐层替换。例如:#define WIDTH 2 #define LENGTH (WIDTH+3) #define AREA (LENGTH*WIDTH)9第九页,共二十七页。(5)对于加有双引号的字符串中出现的宏)对于加有双引号的字符串中出现的宏名不进行替换。例如名不进行替换。例如(lr):#define TWO 2*nint n=8
5、;printf(TWO=%dn,TWO);运行该程序后,输出结果为:运行该程序后,输出结果为:TWO=1610第十页,共二十七页。(6)宏名的作用域为定义该宏名的文件,即)宏名的作用域为定义该宏名的文件,即宏名的作用域是文件级的,从定义时起到文件宏名的作用域是文件级的,从定义时起到文件结束为止。如果有终止宏名命令,则其作用域结束为止。如果有终止宏名命令,则其作用域到终止宏名命令为止。终止宏名命令的格式到终止宏名命令为止。终止宏名命令的格式(g shi)为:为:(7)宏定义时必须注意字符串部分的书写,)宏定义时必须注意字符串部分的书写,保证在宏代换之后与原题意相符。例如:保证在宏代换之后与原题意
6、相符。例如: #define M (y*y+3*y)11#undef #undef 标识符标识符第十一页,共二十七页。12命令的一般命令的一般(ybn)(ybn)形式:形式: 在宏定义中的参数称为形参,在宏调用中的参数在宏定义中的参数称为形参,在宏调用中的参数称为称为实参。实参。 “宏名宏名”同标识符,习惯采用同标识符,习惯采用(ciyng)(ciyng)大写字母;大写字母; “形参表形参表”由一个或多个参数组成,多个参数之间由一个或多个参数组成,多个参数之间用逗号分隔,说明参数时不加类型说明;用逗号分隔,说明参数时不加类型说明;“字符串字符串”中包含了中包含了“形参表形参表”中所指定的参数,
7、它可以中所指定的参数,它可以由若干条语句组成。由若干条语句组成。例如:例如:#define MAX(X,Y) (X)(Y)?(X):(Y)#define #define 宏名宏名( (形参表形参表) ) 字符串字符串第十二页,共二十七页。13带参宏调用带参宏调用(dioyng)(dioyng)的一般形式为:的一般形式为: 带参数的宏定义命令进行宏替换时,不是简单地用带参数的宏定义命令进行宏替换时,不是简单地用“字符串字符串”来替换来替换“宏名宏名”,而是使用,而是使用(shyng)(shyng)“实参实参”来来代换代换“形参形参”,其余部分保持不变。,其余部分保持不变。 宏名宏名( (实参表)
8、实参表)第十三页,共二十七页。说明说明:(1)带参宏定义中,宏名和形参表之间不能)带参宏定义中,宏名和形参表之间不能有空格出现,否则将空格符后边的内容都作有空格出现,否则将空格符后边的内容都作为字符串,成为不带参数的宏定义语句了。为字符串,成为不带参数的宏定义语句了。例如:例如: #define ADD (x,y) (x)+(y)(2)宏代换中的实参一般常为常量、变量或)宏代换中的实参一般常为常量、变量或表达式。在宏展开后容易引起误解的表达式表达式。在宏展开后容易引起误解的表达式,在宏定义时,应将表达式用圆括号括起来,在宏定义时,应将表达式用圆括号括起来,形式参数两边,形式参数两边(lingb
9、in)也应加括号。例如:也应加括号。例如: #define SQ(x) x*x14第十四页,共二十七页。#define PI 3.1415926 #define S (r) PI*r*r #define V(r) 3.0/4* S(r)*r15第十五页,共二十七页。16命令命令(mng lng)(mng lng)的一般形式:的一般形式:格式格式1 1:格式格式2 2:文件包含是指可以在一个源文件中包含另一个源文文件包含是指可以在一个源文件中包含另一个源文件的全部内容,使之成为本文件自身的一部分。用件的全部内容,使之成为本文件自身的一部分。用includeinclude命令命令(mng lng)
10、(mng lng)实现。实现。用用格式格式1 1,指示编译系统在系统设定的标准子目录,指示编译系统在系统设定的标准子目录includeinclude中查找被包含的文件。如果在标准子目录中不存在中查找被包含的文件。如果在标准子目录中不存在指定的文件,编译系统会发出错误信息,并停止编译过程。指定的文件,编译系统会发出错误信息,并停止编译过程。用用格式格式2 2,编译系统首先在源程序所在的目录中查找,如,编译系统首先在源程序所在的目录中查找,如果没有,再到系统设定的标准子目录果没有,再到系统设定的标准子目录includeinclude中查找。中查找。#include #include #includ
11、e #include 文件名文件名 第十六页,共二十七页。说明说明:(1)在编译预处理时,文件包含命令行由被包含文)在编译预处理时,文件包含命令行由被包含文件的内容替换,成为源程序文件内容的一部分,与件的内容替换,成为源程序文件内容的一部分,与其他源程序代码其他源程序代码(di m)一起参加编译。一起参加编译。17第十七页,共二十七页。(2)一个)一个#include命令只能指定一个被包含的文命令只能指定一个被包含的文件件(wnjin),若要包含多个文件,若要包含多个文件(wnjin),必须使用相应多,必须使用相应多个个#include命令。例如:命令。例如:#include #include
12、 #include 下列的文件包含命令是错误的:下列的文件包含命令是错误的:#include 18第十八页,共二十七页。(3)文件包含可以嵌套,即在一个被包含文件中还)文件包含可以嵌套,即在一个被包含文件中还可以包含另外的被包含文件。例如:可以包含另外的被包含文件。例如: 源文件源文件 file.c中有文件包含命令中有文件包含命令(mng lng)#include ,而文件,而文件file1.h又包含了文件又包含了文件file2.h。相。相当于在文件当于在文件file.c中有下列文件包含命令行:中有下列文件包含命令行:#include #include 19第十九页,共二十七页。l有时可能希望
13、程序的某部分在满足一定的条件有时可能希望程序的某部分在满足一定的条件下进行编译,或者下进行编译,或者(huzh)在满足一定的条件下不在满足一定的条件下不进行编译,这就是条件编译。进行编译,这就是条件编译。l条件编译可以产生不同的目标代码文件,使生条件编译可以产生不同的目标代码文件,使生成的目标程序较短,从而减少了内存的开销并成的目标程序较短,从而减少了内存的开销并提高了程序的效率,这对于程序的移植和调试提高了程序的效率,这对于程序的移植和调试是很有用的。是很有用的。20第二十页,共二十七页。1. 条件编译条件编译(biny)命令的格式,有以下三种形式命令的格式,有以下三种形式:(1) #ifd
14、ef 标识符标识符 程序段程序段1 #else 程序段程序段2 #endif功能:功能:如果标识符已被如果标识符已被 #define命令定义过,则对程命令定义过,则对程序段序段1进行编译;否则对程序段进行编译;否则对程序段2进行编译。进行编译。21第二十一页,共二十七页。如果没有程序段如果没有程序段2(为空),本格式中的(为空),本格式中的#else可以没有,即可以写为:可以没有,即可以写为: #ifdef 标识符标识符 程序段程序段 #endif功能:功能:当当“标识符标识符”中的宏名被定义时,中的宏名被定义时,“程序段程序段”中内容参加编译中内容参加编译(biny),否则,否则“程序段程序
15、段”内内容不参加编译容不参加编译(biny)。22第二十二页,共二十七页。(2)#ifndef 标识符标识符 程序段程序段1 #else 程序段程序段2 #endif功能功能(gngnng)(gngnng):如果标识符未被如果标识符未被#define命令定义过,则对程命令定义过,则对程序段序段1进行编译,否则对程序段进行编译,否则对程序段2进行编译。进行编译。 这与第一种形式的功能正好相反这与第一种形式的功能正好相反。23第二十三页,共二十七页。(3) #if 常量表达式常量表达式 程序段程序段1 #else 程序段程序段2 #endif功能:功能:如果常量表达式的值为真(非如果常量表达式的值
16、为真(非“0”),则对程序段),则对程序段1 进行编译,否则对程序进行编译,否则对程序段段2进行编译。因此可以使程序在不同条进行编译。因此可以使程序在不同条件件(tiojin)下,完成不同的功能。其中的表达下,完成不同的功能。其中的表达式必须为常量表达式,在表达式中不能包式必须为常量表达式,在表达式中不能包含变量。含变量。24第二十四页,共二十七页。2. 条件编译命令的应用条件编译命令的应用(1)条件编译命令可以给程序调试带来方)条件编译命令可以给程序调试带来方便便(2)条件编译命令可以使一个源程序生成)条件编译命令可以使一个源程序生成不同的目标代码不同的目标代码(3)使用)使用(shyng)
17、条件编译命令替代条件编译命令替代if语句会减语句会减少目标代码的长度少目标代码的长度25第二十五页,共二十七页。26本章介绍了宏定义、文件包含和条件编译三种编本章介绍了宏定义、文件包含和条件编译三种编译预处理。编译预处理功能是译预处理。编译预处理功能是C语言特有的功能,也是语言特有的功能,也是C语言与其他高级语言的重要区别之一。语言与其他高级语言的重要区别之一。宏定义是用一个标识符来表示一个字符串,这个字宏定义是用一个标识符来表示一个字符串,这个字符串可以是常量、变量或表达式。在宏调用中将用该字符串可以是常量、变量或表达式。在宏调用中将用该字符串代换宏名。符串代换宏名。文件包含命令用来把多个源
18、文件连接成一个源文文件包含命令用来把多个源文件连接成一个源文件进行编译,结果将生成一个目标文件,给程序书写件进行编译,结果将生成一个目标文件,给程序书写(shxi)方面带来了很大的方便。方面带来了很大的方便。条件编译允许只编译源程序中满足条件的程序段条件编译允许只编译源程序中满足条件的程序段,使生成的目标程序较短,从而减少了内存的开销并,使生成的目标程序较短,从而减少了内存的开销并提高了程序的效率。提高了程序的效率。第二十六页,共二十七页。内容(nirng)总结第七章 编译预处理。C语言对源程序在正常编译(包括词法分析、语法分析、代码生成和代码优化)之前先执行源程序中的预处理命令。C语言中,“宏”分为有参宏和无参宏两种。“字符串”用来表示标识符被定义的内容,它通常是常数、表达式、格式串等。宏替换时就要从后向前逐层替换。printf(TWO=%dn,TWO)。(7)宏定义时必须注意字符串部分的书写,保证在宏代换之后与原题意(t y)相符。#include 文件名第二十七页,共二十七页。