C++基础PPT课件第十一章宏和预编译_第1页
C++基础PPT课件第十一章宏和预编译_第2页
C++基础PPT课件第十一章宏和预编译_第3页
C++基础PPT课件第十一章宏和预编译_第4页
C++基础PPT课件第十一章宏和预编译_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

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

文档简介

1、第十一章 宏和预编译,课程内容安排,预编译器及其工作方式。 宏的定义和使用。 使用宏时需要注意的问题。 条件编译。,预处理器和编译器,预处理器是专门用来处理预处理指令的程序。在编译器运行之前,会先运行预处理器,查找所有的预处理指令。预处理指令是以“#”开头,且不以“;”结束,以区分一般的语句。预处理器根据预处理指令生成新的源代码文件(临时文件,可以通过编译器的选项输出到指定目录)。 编译器的作用是把源代码转化成汇编语言或机器指令。但是,编译器并不是直接编译程序员生成的源文件,而是经预处理器处理后所产生的新的源文件。,预处理器的任务,简单来讲,预处理器的任务就是执行源代码中的预处理指令,并对源代

2、码进行相应的处理。因此从预处理指令的类型来讲,预处理器的任务包括如下的几个部分。 将其他文件包含到当前文件中; 定义宏,用来取代某些复杂文本; 定义类似函数的宏,以更加灵活的方式控制源代码; 实施条件编译,即有选择的编译源代码的某些部分。,宏的作用,使用预处理指令#define定义的宏主要有三个方面的作用: 替代字面常量; 替代运算符; 声明某个符号已经被定义,通常用于条件编译。,替代字面常量,用宏替代字面常量是宏非常重要的一个功能。其好处是直观、简洁、修改方便。譬如对于圆周率,其值是一个无理数常量,3.14159。 如果在程序中每一处要使用圆周率的地方都直接书写这个常量,那么源代码修改起来就

3、不太方便。一旦要求改变数字的精度,减少或增加的小数位数,则所有使用到的地方都要修改。无疑修改量会比较大,而且容易出错。,带参数的宏,定义带参数宏的语法同定义函数类似,在紧跟在宏名之后有用括号包围起来的参数列表,但没有返回值类型、参数类型等的声明。如下所示: #define 宏名(参数1, 参数2, 参数n) 可替换文本 如果可替换文本一行写不完,可以分成多行,并在每一行的结尾处加上续行符号“”,除了最后一行。,C/C+中的宏指令都是在ANSI标准中的。,宏指令,预定义的宏指令为程序提供了条件编译的功能。条件编译可以按不同的条件去编译不同的程序部分,因而产生不同的目标代码文件。这对于程序的移植和

4、调试是很有用的。C+中的条件编译有三种形式 #ifdef形式 2. #ifndef形式 3. #if形式,利用预定义的宏指令进行条件编译,文件包含命令,就是指宏指令#include。通常有两种形式的包含。第一种是尖括号包含的文件,表示要到系统目录下去寻找被包含的文件。第二种是引号包含的文件,表示在当前工程目录中去寻找被包含的文件。,文件包含命令和包含警卫,小结,本章主要介绍了C+中编译预处理的基本内容,主要包括宏、文件包含和条件编译三部分内容。本章首先讨论预编译器及其工作方式,接着重点宏的概念、作用,以及如何定义和使用宏。最后讲解了C+中的宏指令和预定义宏的内容,以及如何利用预定义宏进行条件编

5、译等内容。学习完本章,读者应对编译器编译C+源程序的过程有一定理解。,习题,【题目155】从下面的选项中选出正确的答案,在宏定义#define MAX 100中,宏名MAX代替的是? A实型数B整型数C常量D一串字符 【分析】该试题主要考查宏定义的相关概念。在宏替换中,不管宏名是什么标识符,其替代的都是一个常量,这个常量也不会区分浮点型、整型或字符型等数据类型,而是在具体的程序引用中进行区分。因此,该试题中宏名MAX代替的是一个常量。,【题目156】编写一个标准宏MIN,这个宏输入两个参数并返回较小的一个,注意参数在调用时可能是表达式的情况。 【分析】该试题主要考查宏定义的定义和使用。宏定义可

6、以实现类似于函数的功能,但是它终归不是函数,而宏定义中括弧中的“参数”也不是真的参数,在宏展开的时候对“参数”进行的是一对一的替换。读者需要谨慎地将宏定义中的“参数”和整个宏用用括弧括起来,所以严格地讲下述解答都是错误的: #define MIN(A,B) (A) = (B) ? (A) : (B) #define MIN(A,B) (A = B ? A : B ) 正确的写法应如下所示: #define MIN(A,B) (A) = (B) ? (A) : (B),【题目157】编写一个C+程序,在程序中定义一个不带参数的宏PI,使其完成求给定半径的圆的周长和面积。 【分析】该试题主要考查宏

7、在具体程序中的应用。根据前面章节的学习,读者知道求给定圆半径的周长和面积可以通过声明变量和常量来实现,其中由于PI是不会变的,其值为3.14,因此可以将其声明为常量。在学习了宏后,可以将该常量声明为宏,其他语句不变。,【题目158】什么是预编译,何时需要预编译? 【分析】预编译就是指程序执行前的一些预处理工作,其主要指用#来表示的一系列表达式。使用预编译主要针对: a.总是使用不经常改动的大型代码体。 b.程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项。在这种情况下,可以将所有包含文件预编译为一个预编译头。,【题目159】定义一个带参数的宏swap,使其完成两个整数的交换

8、功能。 【分析】该试题主要考查带参数宏的定义和使用。试题要求宏完成两个整数的交换功能,根据前面学习的内容,读者知道不适用第三方变量可以实现两个值的交换,即通过两个变量的复合赋值运算来实现,此处同样可以通过定义该赋值运算从而完成宏swap的实现。,【题目160】宏可以带参数,而且带参数的宏与带参数的函数的写法和调用都很相似,但是其存在本质上的不同,其区别在何处,请试着通过两个例子进行说明。 【分析】该试题主要考查函数和宏的区别。函数调用时要把实参表达式的值求出来再赋予形参,而宏代换中对实参表达式不作计算直接地代换。这导致了即使把同一表达式用函数处理与用宏处理,两者的结果有可能是不同的。下面通过具

9、体例子进行说明,如下分别定义了一个带参宏和带参函数,其函数名为SQ,形参为Y,函数体表达式为(y)*(y),而宏定义也定义字符串为(y)*(y)。,【题目161】用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题) 【分析】该试题主要考查#define指令。读者需明确#define 语法的基本知识,懂得预处理器计算常数表达式的值,因此直接写出是如何计算一年中有多少秒而不是计算出实际的值。此外,读者需意识到这个表达式将使一个16位机的整型数溢出,因此要用到长整型符号L,告诉编译器这个常数是长整型数。在表达式中用到UL(表示无符号长整型),因此,该问题的答案如下 #de

10、fine SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL,【题目162】下列叙述正确的是:( )。 A一个程序中可以有多个#include命令行 B#include命令行中,用双引号和用尖括号将被包含的文件名括起来没有区别 C#include命令行只能放在程序开始位置 D#include命令后也必须以分号结束 【分析】该试题主要考查#include命令的使用。在编译预处理中,#include命令主要用于声明包含文件,其一般放在程序开始位置,但可以放任意位置。#include命令不需加上分号表示结束,因此其不作为C+的一般语句进行处理。此外,#include命令有两种形式包含文件:用双引号和用尖括号包含,这两种写法是有区别的,前者一般用于包含用户自定义文件,而后者一般用于包含系统文件。因此,根据如上分析,该试题正确选项为A。,【题目163】编写一个宏,使其打印出100到200之间的所有素数。 【题目164】编写一个宏,用于把十进制整数x转换为十六进

温馨提示

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

评论

0/150

提交评论