C语言程序设计实用教程 教学课件 ppt 作者 周虹 课件 第8章 编译预处理

上传人:E**** 文档编号:89190631 上传时间:2019-05-21 格式:PPT 页数:37 大小:659KB
返回 下载 相关 举报
C语言程序设计实用教程 教学课件 ppt 作者 周虹 课件 第8章 编译预处理_第1页
第1页 / 共37页
C语言程序设计实用教程 教学课件 ppt 作者 周虹 课件 第8章 编译预处理_第2页
第2页 / 共37页
C语言程序设计实用教程 教学课件 ppt 作者 周虹 课件 第8章 编译预处理_第3页
第3页 / 共37页
C语言程序设计实用教程 教学课件 ppt 作者 周虹 课件 第8章 编译预处理_第4页
第4页 / 共37页
C语言程序设计实用教程 教学课件 ppt 作者 周虹 课件 第8章 编译预处理_第5页
第5页 / 共37页
点击查看更多>>
资源描述

《C语言程序设计实用教程 教学课件 ppt 作者 周虹 课件 第8章 编译预处理》由会员分享,可在线阅读,更多相关《C语言程序设计实用教程 教学课件 ppt 作者 周虹 课件 第8章 编译预处理(37页珍藏版)》请在金锄头文库上搜索。

1、佳木斯大学,1,C语言程序设计实用教程,第8章 编译预处理,佳木斯大学,2,本章学习目标,掌握宏定义:不带参数的宏定义、带参数的宏定义 能够正确应用“文件包含”处理,佳木斯大学,3,【教学目的】,1、掌握宏定义、区别有参的宏和函数调用。 2、正确应用“文件包含”。,佳木斯大学,4,【主要内容】,1、宏定义 2、文件包含 3、宏定义和文件包含的应用,佳木斯大学,5,【重点与难点】,1、有参的宏和函数调用的区别 2、正确使用文件包含,佳木斯大学,6,【教学方法】,采用理论讲解、讨论式的教学方法,佳木斯大学,7,【教学内容】,带着问题学习: (1)有参数的宏和函数调用的区别 (2)宏展开时应注意的问

2、题 (3)文件包含中“”和的区别,佳木斯大学,8,编译预处理,“编译预处理”是C语言编译系统的一个组成部分。C语言允许在程序中使用几种特殊的命令(它们不是一般的C语句)。在C语言编译系统对程序进行通常的编译(包括词法和语法分析,代码生成,优化等)之前,先对程序中这些特殊的命令进行“预处理”,然后将预处理的结果和源程序一起再进行通常的编译处理,以得到目标代码。,佳木斯大学,9,预处理命令,C语言提供的预处理功能主要有以下三种: (1)宏定义 (2)文件包含 (3)条件编译 为了区别预处理命令和C语句、定义和说明语句,规定: 必须以#开始 每行末尾不能加分号,佳木斯大学,10,8-1 宏定义,用一

3、个指定的标识符(即名字)来代表一个字符串,它的一般形式为: #define标识符 字符串 这种方法使用户能以一个简单的名字代替一个长的字符串,因此把这个标识符(名字)称为“宏名”,在预编译时将宏名替换成字符串的过程称为“宏展开”。#define是宏定义命令。,佳木斯大学,11,8-1 宏定义,(1)宏名一般习惯用大写字母表示,以便与变量名相区别。但这并非规定,也可以用小写字母。 (2)使用宏名代替一个字符串,可以减少程序中重复书写某些字符串的工作量。当需要改变某一个常量时,可以只改变#define命令行,一改全改。,佳木斯大学,12,8-1 宏定义,(3)宏定义是用宏名代替一个字符串,也就是作

4、简单的置换,不作语法检查。不管含义是否正确,只有在编译已被宏展开后的源程序时才报错。 (4)宏定义不是C语句,不能在行末加分号,如果加了分号则会连分号一起进行置换。 (5)#define命令出现在程序中函数的外面,宏名的有效范围为定义命令之后到本源文件结束。,佳木斯大学,13,8-1 宏定义,(6)可以用undef命令终止宏定义的作用域 例如: #define PI 3.1416 main() 有效范围 #undef PI void f() 由于#undef的作用,使PI的作用范围在#undef行处终止,因此在f函数中PI不再代表3.1416,佳木斯大学,14,8-1 宏定义,(7)在进行宏定

5、义时,可以引用已定义的宏名,可以层层置换。 【例8-1】 #define R 3.0 #define PI 3.1415926 #define L 2*PI*R #define S PI*R*R main() printf(“L=fnS=fn“,L,S); ,运行结果: L=18.849556 S=28.274333,佳木斯大学,15,8-1 宏定义,8-1-2 带参数的宏定义 带参数的宏定义不是进行简单的字符串替换,还要进行参数替换,其定义的一般形式为: #define 宏名(参数表) 字符串 字符串中包含在括弧中所指定的参数,佳木斯大学,16,8-1 宏定义,8-1-2 带参数的宏定义 (

6、1)对带参数的宏的展开只是将语句中的宏名后面括号内的实参字符串代替#define命令行中的形参。 (2)在宏定义时,在宏名与带参数的括弧之间不应加空格,否则将空格以后的字符都作为替代字符串的一部分。,佳木斯大学,17,8-1 宏定义,8-1-2 带参数的宏定义 带参数的宏定义与函数是不同的,区别主要有: (1)函数调用时,先求出实参表达式的值,然后代入形参,而使用带参数的宏只是进行简单的字符替换。,佳木斯大学,18,8-1 宏定义,8-1-2 带参数的宏定义 (2)函数调用是在程序运行时处理的,分配临时的内存单元。而宏展开则是在编译时进行的,在展开时并不分配内存单元,不进行值的传递处理,也没有

7、“返回值”的概念。,佳木斯大学,19,8-1 宏定义,8-1-2 带参数的宏定义 (3)对函数中的实参和形参都要定义类型,二者的类型要求一致,如不一致,应进行类型转换。而宏不存在类型问题,宏名无类型,它的参数也无类型,只是一个符号代表,展开时代入指定的字符即可。带参数的宏中的形参也不是变量,也不必定义其类型。 (4)调用函数只可得到一个返回值,而用宏可以设法得到几个结果。,佳木斯大学,20,8-1 宏定义,8-1-2 带参数的宏定义 (5)使用宏次数多时,宏展开后源程序长,因为每展开一次都使程序增长,而函数调用不会使源程序变长。 (6)宏替换不占运行时间,只占编译时间,而函数调用则占运行时间(

8、分配单元、保留现场、值传递、返回)。,佳木斯大学,21,8-1 宏定义,8-1-2 带参数的宏定义 【例8-2】分析下面程序的执行结果 #include #define SQR(x) x*x main() int a,k=3; a=+SQR(k+1); printf(“%dn“,a); ,运行结果: 9,佳木斯大学,22,8-1 宏定义,【例8-3】 程序示例。 #define PR printf #define NL “n“ #define D “%d“ #define D1 D NL #define D2 D D NL #define D3 D D D NL #define D4 D D

9、D D NL #define S “s“ main() int a,b,c,d; char string =“CHINA“; a=1;b=2;c=3;d=4; PR(D1,a); PR(D2,a,b); PR(D3, a,b,c); PR(D4,a,b,c,d); PR(S,string); ,运行结果: 1 1 2 1 2 3 1 2 3 4 CHINA,佳木斯大学,23,8-2 “文件包含”处理,所谓“文件包含”处理是指一个源文件可以将另外一个源文件的全部内容包含进来,即将另外的文件包含到本文件之中。C语言提供了#include命令用来实现“文件包含”的操作,其一般形式为: #includ

10、e 或 #include “文件名“,佳木斯大学,24,8-2 “文件包含”处理,注意,在编译时并不是作为两个文件连接(用link命令实现连接),而是作为一个源程序编译,得到一个目标(.OBJ)文件,因此被包含的文件也应该是源文件而不应该是目标文件。,佳木斯大学,25,8-2 “文件包含”处理,(1)一个include命令只能指定一个被包含文件,如果要包含n个文件,要用n个include命令。 (2)在一个被包含文件中又可以包含另一个被包含文件,即文件包含是可以嵌套的。,佳木斯大学,26,8-2 “文件包含”处理,(3)在#include命令中,文件名可以用双引号或尖括号括起来,如包含file

11、l.c,可用 #include “file1.h“或 #include 都是合法的,二者的区别是:用双引号(即“file1.h“形式)的,系统先在引用被包含文件的源文件所在的文件目录中寻找要包含的文件,若找不到,再按系统指定的标准方式检索其它目录。而用尖括号(即形式)时,不检查源文件所在的文件目录而直接按系统标准方式检索文件目录。,佳木斯大学,27,8-2 “文件包含”处理,(4)C语言本身也为用户提供了许多库子程序,包括标准函数和宏定义。用户可以在自己的程序中使用这些库子程序完成一系列工作。与函数相关的信息存在一些后缀为.h的头文件中。用户要想使用这些库函数,必须用#include命令将有关

12、头文件包含在自己的源程序中。,佳木斯大学,28,8-2 “文件包含”处理,【例8-4】 #include /*字符串函数strcpy相关头文件*/ #include /*输出函数puts相关头文件*/ main() char s=“string“; puts(s); strcpy(s,“hello“); puts(s); ,运行结果: string hello,佳木斯大学,29,8-2 “文件包含”处理,【例8-5】 /*主函数所在的文件名为f1.c*/ #include /*“文件包含”命令*/ #include main( ) /*主函数*/ int a,b,c; /*定义变量*/ pri

13、ntf(“input two number“); /*提示输入两个数*/ scanf(“%d,%d“, /*将c的值返回,通过mul带回调用处*/ ,佳木斯大学,30,8.3 应 用 举 例,【例8.6】利用宏定义求出两个数中的最小数。 #include #define MIN(x,y)(x)y)?(x):(y) main() int a,b,min; printf(“input a,b:“); scanf(“%d%d“, ,运行时若输入3,5则输出结果为: MIN=3,佳木斯大学,31,8-3 例 题,【例8-7】执行下述程序后,输出的结果是 #include #define SQR(X)

14、X*X void main() int a=10,k=2,m=1; a/=SQR(k+m)/SQR(k+m); printf(“%dn“,a); A、10 B、1 C、-1 D、0,B,佳木斯大学,32,8-3 例 题,【例8-8 】下述叙述中, 是错误的。 A、#include命令可以包含一个有函数定义的C语言源程序文件 B、使用#include的形式比使用#include“文件名“格式省编译时间 C、#include “C:USERF1.H“是正确包含命令,它表示文件F1.H存放在C盘的USER目录下 D、#include格式中的文件名之前是不能包括路径的,C,佳木斯大学,33,8-3 例

15、 题,【例8-9】下面是对宏定义的描述,不正确的是 A、宏不存在类型问题,宏名无类型,它的参数也无类型 B、宏替换不占用运行时间 C、宏替换时先求出实参表达式的值,然后代入形参数运算求值 D、其实,宏替换只不过是字符替代而已,C,佳木斯大学,34,8-3 例 题,【例8-7】 下述程序段中, 不含有错误。 A、#define F(n) (n)=l?1:(n*F(n)-1) B、#define swap(x,y) int t=x;x=y;y=t; #include void main() int a,b; a=10,b=20; swap(a,b); printf(“d,d“,a,b); ,D、#

16、define PLUS + #define OK 1 void main() int x,y; scanf(“%d“, ,C、#define M(x,y) (x/y) #include void main() int a=2,b=3,c=0,d=5; int x=M(a+b,c+d); printf(“d“,x); ,D,佳木斯大学,35,8-3 例 题,【例8-10】 以下程序(程序左边的数字为附加的行号) 1 #include 2 #include 3 main() 4 char s=“string“; 5 puts(s); 6 strcpy(s,“hello“); 7 printf(“3sn“,s); A、没有错 B、第1行有错 C、第6行有错 D

展开阅读全文
相关资源
相关搜索

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

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