第八章预编译概要

上传人:今*** 文档编号:109951748 上传时间:2019-10-28 格式:PPT 页数:25 大小:226KB
返回 下载 相关 举报
第八章预编译概要_第1页
第1页 / 共25页
第八章预编译概要_第2页
第2页 / 共25页
第八章预编译概要_第3页
第3页 / 共25页
第八章预编译概要_第4页
第4页 / 共25页
第八章预编译概要_第5页
第5页 / 共25页
点击查看更多>>
资源描述

《第八章预编译概要》由会员分享,可在线阅读,更多相关《第八章预编译概要(25页珍藏版)》请在金锄头文库上搜索。

1、第八章 预处理 (P239),宏定义、文件包含、条件编译,9.1 宏定义 (P235),一、不带参数的宏定义,其定义的一般形式为: #define 标识符 字符串,凡是以“#”开头的均为预处理命令。所谓预处理是指当对一个源文件进行编译时,系统将自动地用于处理程序对源程序中的预处理部分作处理,处理完毕自动进入对源程序的编译。,在语言源程序中允许用一个标识符来表示一个字符串, 称为“宏”。,在编译预处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去代换, 这称为“宏代换”或“宏展开”。,例如:#define PI 3.1415926,“define”为宏定义命令。 “标识符”为所定义的宏名

2、。,“字符串”可以是常数、表达式、格式串等。,#define PRICE 30 main() int num,total; num=10; total=num*PRICE; printf(“total=%d“,total); getch();,例如:,#define M (y*y+3*y) main() int s,y; printf(“input a number: “); scanf(“%d“,宏定义中的()是必要的吗?为什么?,对于宏定义还要说明以下几点:,1、 宏名一般习惯用大写字母表示,以便与变量名相区别。但也允许用小写字母。,2、宏定义是用宏名来表示一个字符串,在宏展开时又以该字符

3、串取代宏名,这只是一种简单的代换,预处理程序对它不作任何检查。如有错误,只能在编译已被宏展开后的源程序时发现。,3、 宏定义不是说明或语句,在行末不必加分号,如加上分号则连分号也一起置换。,4、 宏定义一般写在函数之外,其作用域为宏定义命令起到源程序结束。如要终止其作用域可使用# undef命令,5、宏名在源程序中若用引号括起来,则预处理程序不对其作宏代换。,6、宏定义允许嵌套,在宏定义的字符串中可以使用已经定义的宏名。在宏展开时由预处理程序层层代换。,例如: #define PI 3.1415926 #define S PI*y*y,对语句 printf(“%f“,S); 在宏代换后变为:

4、printf(“%f“,3.1415926*y*y);,二、带参数的宏定义 (P236),#define 宏名(形参表) 字符串,语言允许宏带有参数。在宏定义中的参数称为形式参数, 在宏调用中的参数称为实际参数。对带参数的宏,在调用中,不仅要宏展开, 而且要用实参去代换形参。,带参宏定义的一般形式为:,宏名(实参表),带参宏调用的一般形式为:,例如: #define S(a,b) a*b area=S(3,2);,例如: #define M(y) y*y+3*y k=M(5);,经预处理宏展开后的语句为: k=5*5+3*5,#define MAX(a,b) (ab)?a:b main() i

5、nt x,y,max; printf(“input two numbers: “); scanf(“%d%d“,对于带参的宏定义有以下问题需要说明:,1、 带参宏定义中,宏名和形参表之间不能有空格出现。,例如: 把 #define MAX(a,b) (ab)?a:b 写为: #define MAX (a,b) (ab)?a:b 将被认为是无参宏定义 宏名MAX代表字符串(a,b)(ab)?a:b。,宏调用语句: max=MAX(x,y); 将变为: max=(a,b)(ab)?a:b(x,y);,3、 在宏定义中,字符串内的形参通常要用括号括起来以避免出错。,2、在宏定义中的形参是标识符,而宏

6、调用中的实参可以是 表达式。,4、宏定义也可用来定义多个语句,在宏调用时,把这些语句又代换到源程序内。,#include “stdio.h“ #define FMAG(y) 2.84+y #define PR(a) printf(“%d“,(int)(a) #define PRINT1(a) PR(a);putchar (n); main( ) int x=2; PRINT1(FMAG(5)*x) getch(); ,文件包含命令的功能是把指定的文件插入该命令行位置取代该命令行, 从而把指定的文件和当前的源程序文件连成一个源文件。,9.2 文件包含 (P237),文件包含命令行的一般形式为:

7、#include “文件名“,1、 包含命令中的文件名可以用双引号括起来,也可以用 尖括号括起来。,#include ,使用尖括号表示在包含文件目录中去查找(包含目录是由用户在设置环境时设置的) ,而不在源文件目录去查找;这称为标准方式。,对文件包含命令还要说明以下几点:,#include “math.h”,使用双引号则表示首先在当前的源文件目录中查找,若未找到才到包含目录中去查找。,2、 一个include命令只能指定一个被包含文件, 若有多个 文件要包含,则需用多个include命令。,9.3 条件编译 (P239) 预处理程序提供了条件编译的功能。 可以按不同的条件去编译不同的程序部分,

8、因而产生不同的目标代码文件。,1. 第一种形式: #ifdef 标识符 程序段1 #else 程序段2 #endif,它的功能是: 如果标识符已被 #define命令定义过,则对程序段1进行编译; 否则对程序段2进行编译。,#ifdef COMPUTER_A #define INTEGER_SIZE 16 #else #define INTEGER_SIZE 32 #endif,例如:,2. 第二种形式: #ifndef 标识符 程序段1 #else 程序段2 #endif,如果标识符未被#define命令定义过则对程序段1进行编译, 否则对程序段2进行编译。,3. 第三种形式: #if 常量

9、表达式 程序段1 #else 程序段2 #endif,它的功能是,如常量表达式的值为真(非0),则对程序段1 进行编译,否则对程序段2进行编译。,#define R 1 main() float c,r,s; scanf(“%f“, #endif,本章小结:,1. 预处理功能是语言特有的功能,它是在对源程序正式编译前由预处理程序完成的。程序员在程序中用预处理命令来调用这些功能。,2. 宏定义是用一个标识符来表示一个字符串,这个字符串可以是常量、变量或表达式。在宏调用中将用该字符串代换宏名。,3. 宏定义可以带有参数,宏调用时是以实参代换形参。而不是“值传送”。,4. 为了避免宏代换时发生错误,宏定义中的字符串应加括号,字符串中出现的形式参数两边也应加括号。,5. 文件包含是预处理的一个重要功能,它可用来把多个源文件连接成一个源文件进行编译,结果将生成一个目标文件。,6. 条件编译允许只编译源程序中满足条件的程序段,使生成的目标程序较短,从而减少了内存的开销并提高了程序的效率。,7. 使用预处理功能便于程序的修改、阅读、移植和调试,也便于实现模块化程序设计。,作业:,一、输入两个整数,求它们相除的余数,用带参的宏来实现。,二、 P248 第7题,三、分别用函数和带参的宏,从三个数中找出最大值。,

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号