C++程序设计第6章 编译预处理_第1页
C++程序设计第6章 编译预处理_第2页
C++程序设计第6章 编译预处理_第3页
C++程序设计第6章 编译预处理_第4页
C++程序设计第6章 编译预处理_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

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

文档简介

1、 第6章 编译预处理 目的与要求6.1 文件包含处理6.2 宏定义6.3 条件编译本章小结编辑课件目的与要求 通过本章学习,应理解编译预处理的概念。理解“文件包含”的概念,掌握文件包含命令的使用方法。理解宏定义的概念,掌握不带参数的宏定义命令和带参数的宏定义命令的使用方法。理解条件编译的概念,初步掌握条件编译命令的使用方法。 编辑课件编译预处理概念 1.编译预处理的概念 “编译预处理”是指在对源程序进行通常的编译之前,根据编译预处理程序所提供的预处理命令对源程序作相应的处理。 2.C+的编译预处理命令 C+的预处理命令主要有以下三种: (1)文件包含 (2)宏定义 (3)条件编译编辑课件6.1

2、 文件包含处理 1.定义:将另一个头文件(.h)内容包含到本源文件中来称为文件包含处理。 2.文件包含命令#include (1)命令格式: #include “文件名” 或: #include (2)功能:将“文件名”所指文件内容读到当前文件中。作为当前文件的一个组成部分,即把文件的内容替代该#include命令行。编辑课件文件包含处理 【例6.1】 输入两个整数a和b,输出其中较大的一个数。 说明: (1)#include只能指定一个被包含文件。 (2)文件包含是可以嵌套的。 (3)在#include命令中,文件名可以用双引号或尖括号括起来。 (4)文件包含命令可出现在程序中的任何位置。例

3、程编辑课件文件包含处理 文件包含的使用: (1)在程序文件要用到C+的库函数时,必须把含有该库函数的头文件包含到本文件中。 (2)在设计一个大型程序时,可将程序公用的一些数据结构、输出格式定义成头文件,然后在相应的处理程序中,用文件包含命令将相应的头文件包含进来。 【例6.2】 求矩形的对角线的长、周长和面积。 例程编辑课件6.2 宏定义 定义:用指定标识符(宏名)来代表一个字符串称为宏定义。 6.2.1 不带参数的宏定义 1.命令格式: #define 字符串 2.功能:用宏名代替字符串。 3.宏展开:在编译预处理时将宏名替换成字符串的过程称为“宏展开”。 【例6.3】 求圆的周长、面积及圆

4、球的体积。 例程编辑课件不带参数的宏定义 说明: (1)宏名一般习惯用大写字母表示,以便与变量名相区别; (2)使用宏名代替一个字符串,可以减少程序中重复书写某些字符串的工作量; (3)宏定义是用宏名代替一个字符串,仅作简单的替换;不作正确性检查; (4)宏定义不是C+语句,不必在行末加分号。如果加了分号,则会连同分号一起进行替换; (5)宏定义可出现在程序中的任何位置。通常,将宏定义放在源程序文件开始部分。宏名的作用域为从宏定义开始到本源程序文件结束。编辑课件不带参数的宏定义 (6)可以用#undef命令终止宏名的作用域,其一般格式为: #undef 标识符 (7)在进行宏定义时,可以引用已

5、定义的宏名,即宏名可以层层替换。 (8)对程序中用双引号括起来的字符串内的字符,即使与宏名相同,也不进行替换。 (9)在同一个作用域内,同一个宏名不能定义两次或两次以上; (10)宏定义与定义变量的含义不同,只作字符替换,不分配内存空间。 【例6.4】 求圆的周长、面积及圆球的体积。 例程编辑课件6.2.2 带参数的宏定义 1.命令格式: #define (参数表) 字符串 2.功能: 将带形参的字符串定义为一个带形参的宏名。 3.宏调用: 在编译预处理时将带实参的宏名用指定的字符串进行替换,并用实参替换形参,这被称为“宏调用” 。 【例6.5】 求圆的周长、面积及圆球的体积。例程编辑课件带参

6、数的宏定义 说明: (1)带参数宏调用时,只是将语句中宏名后面括号内的实参代替#define命令行中的形参。当宏调用中包含的实参有可能是表达式时,在宏定义时要用括号把形参括起来,以避免错误。 (2)在宏定义时,在宏名与带参数的括号之间不能有空格,否则将空格以后的全部字符都作为无参宏所定义的字符串。 编辑课件带参数的宏与函数的区别注意:带参数的宏和函数的区别: (1)两者的定义形式不一样。宏定义中只给出形式参数,而不要指明每一个形式参数的类型;而在函数定义时,必须指定每一个形式参数的类型; (2)函数调用是在程序运行时进行的,分配临时的内存单元;而宏调用则是在编译前进行的,并不分配内存单元,不进

7、行值的传递处理。 (3)函数调用时,先求实参表达式的值,然后将值代入形参;而宏调用时只是用实参简单地替换形参; (4)函数调用时,要求实参和形参的类型一致;而宏调用时不存在类型问题; (5)使用宏次数多时,宏展开后源程序变长,因为每一次宏展开都使源程序增长;而函数调用不使源程序变长。编辑课件6.3 条件编译 定义:对源程序的一部分内容指定编译条件称为条件编译。 条件编译命令有三种格式。 1.格式1 (1)格式: #ifdef 标识符 程序段1 #else 程序段2 #endif (2)功能: 当所指定的标识符已经被 #define命令定义过,则在程序编译阶段只编译程序段1;否则编译程序段2,或

8、不编译。 编辑课件条件编译 2.格式2 (1)格式: #ifndef 标识符 程序段1 #else 程序段2 #endif (2)功能: 当所指定的标识符没有被 #define命令定义过,则在程序编译阶段只编译程序段1;否则编译程序段2,或不编译。 编辑课件条件编译 3.格式3 (1)格式: #if 表达式 程序段1 #else 程序段2 #endif (2)功能: 当指定的表达式的值为真(非零)时,编译程序段1;否则编译程序段2,或不编译。 编辑课件条件编译 说明: (1)条件编译命令与宏定义一样,可以出现在程序中的任何地方; (2)当把表达式的值作为条件编译的条件时,在编译预处理时,必须能

9、求出表达式的值,即该表达式中只能包含一些常量的运算。 (3)条件编译命令不仅可用于调试程序,也可用于文件包含命令中。 【例6.6】使用条件编译命令解决由于文件包含而出现的变量重名问题。 例程编辑课件本章小结 1.“文件包含”处理 “文件包含”是指将一个头文件或源程序文件的内容包含到本文件中的操作。 C+提供了#include命令用来实现“文件包含”处理。“文件包含”处理的一般格式为: #include 文件名 或: #include 编辑课件2.宏定义 宏定义是用一个标识符(宏名)来代表一个字符串。有两种形式的宏定义,即不带参数的宏定义和带参数的宏定义。 (1)不带参数的宏定义 不带参数的宏定

10、义的一般格式为: #define 字符串 (2)带参数的宏定义 带参数的宏定义的一般格式为: #define (参数表) 字符串 注意:带参数的宏定义和函数的区别。编辑课件3.条件编译 “条件编译”就是对源程序的部分内容指定编译条件。有三种形式的条件编译命令。 (1) 格式1 #ifdef 标识符 程序段1 #else 程序段2 #endif编辑课件条件编译( 2)格式2 #ifndef 标识符 程序段1 #else 程序段2 #endif (3)格式3 #if 表达式 程序段1 #else 程序段2 #endif编辑课件例6.1(1)文件filemax.h的内容为:int max(int x

11、,int y) int z; if (x=y) z=x; else z=y; return(z);文件filemain.cpp的内容为:#include #include filemax.hvoid main(void) int a,b,m; coutab; m=max(a,b); coutmax=mendl; 编辑课件例6.1(2)#include =y) z=x; else z=y; return(z); void main(void) int a,b,m; coutab; m=max(a,b); coutmax=cendl; 预编译预处理后,文件filemain.cpp变为如下形式: 返

12、回编辑课件例6.2#include #include void main(void) float a,b,p,l,s; coutab; p=sqrt(a*a+b*b); l=2*(a+b); s=a*b; cout长方形对角线=pendl; cout长方形周长= lendl; cout长方形面积= sendl; 程序执行后提示: 输入长方形的边长:3 4 长方形对角线=5 长方形周长= 14 长方形面积= 12返回编辑课件例6.3#include #define PI 3.14159void main(void) float r,l,s, v; coutr; l=2.0*PI*r; s=PI*

13、r*r; v=4.0/3.0*PI*r*r*r; cout Perimeter =lendl; coutArea=sendl; coutVolume=vendl; 程序执行后提示: Input radious:10 Perimeter=62.8318 Area=314.159 Volume=4188.79返回编辑课件例6.4#include #define PI 3.14159#define R 10.0#define L 2*PI*R#define S PI*R*R#define V 4.0/3.0*PI*R*R*Rvoid main(void) coutL=Lendl; coutS=Sen

14、dl; coutV=Vendl; 程序执行后输出: L=62.8318 S=314.159 V=4188.79返回编辑课件例6.5#include #define PI 3.14159#define L(r) 2.0*PI*r#define S(r) PI*r*r#define V(r) 4.0/3.0*PI*r*r*rvoid main(void) float radius,length,area,volume; coutradius; length=L(radius); area=S(radius); volume=V(radius); coutL=lengthendl;coutS=are

15、aendl;coutV=volumeendl; 返回编辑课件例6.6(1)源文件exemple6_6.cpp的内容为:# include # include exemple6_6.h# define PI 3.14159# define R 6# define AREA R*R*PIfloat volume;void main(void) volume=4*PI*R*R*R /3; cout圆的面积=AREAendl; cout圆球体积=volumeendl; 头文件exemple6_6.h内容为: # define R 6 float volume;编辑课件例6.6(2)预编译后的源文件为:

16、# include # define R 6float volume;# define PI 3.14159# define R 6# define AREA R*R*PIfloat volume;void main(void) volume=4*PI*R*R*R /3; cout圆的面积=AREAendl; cout圆球体积=volumeendl; 编译出错编辑课件例6.6(3)采用条件编译命令后的头文件exemple6_6.h修改如下: #ifndef _EX_ H # define _EX_ H # define R 6 float volume; # endif 编辑课件例6.6(4) 采用条件编译命令后的源文件exemple6_6.cpp修改如下:# include # in

温馨提示

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

评论

0/150

提交评论