高级语言程序设计 课件 第9章 编译预处理_第1页
高级语言程序设计 课件 第9章 编译预处理_第2页
高级语言程序设计 课件 第9章 编译预处理_第3页
高级语言程序设计 课件 第9章 编译预处理_第4页
高级语言程序设计 课件 第9章 编译预处理_第5页
已阅读5页,还剩10页未读, 继续免费阅读

付费下载

下载本文档

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

文档简介

第9章编译预处理9.1宏定义命令

文件包含命令9.2

条件编译命令9.3本章内容导读本章主要介绍宏定义、文件包含和条件编译三种编译预处理命令。通过学习本章,读者应掌握以下内容:掌握宏定义及其使用方法;了解文件包含命令的格式和使用方法;了解条件编译命令的各种格式和功能。编译预处理是指对源程序进行编译之前,先对源程序中的各种预处理命令进行处理;然后再将处理结果和源程序一起进行编译,以获得目标代码。分类

无参数宏定义命令有参数宏定义命令功能

用于定义程序中的符号常量、类型别名、运算式代换和语句代换等。

优势

提高源程序的可维护性。

提高源程序的可移植性。减少源程序中重复书写字符串的工作量。9.1宏定义命令格式

#define宏名字符序列其中“define”为宏定义命令;“宏名”是标识符的一种,通常用大写字母表示,以便于与变量区别;“字符序列”可以是常数、表达式、格式串等。说明宏名一般用大写字母,以便与变量区别。但这并非是规定。宏定义不是C语句,所以不能在行尾加分号。否则,宏展开时,会将分号作为字符串的1个字符,用于替换宏名。宏展开时,预处理程序仅按宏定义简单替换宏名,而不作任何检查。如果有错误,只能由编译程序在编译宏展开后的源程序时发现。宏定义命令#define出现在函数的外部,宏名的有效范围是从定义命令之后,到本文件结束。通常,宏定义命令放在文件开头处。进行宏定义时,可以引用已定义的宏名。对双引号括起来的字符串内的字符,即使与宏名同名,也不进行宏展开。例如#definePI3.141591、无参宏定义9.1宏定义命令说明在定义无参宏时,如果“字符序列”是一个常量,则相应的“宏名”就是一个符号常量。恰当命名的符号常量,除具有宏定义的上述优点外,还能表达出它所代表常量的实际含义,从而增强程序的可读性,例如:#defineEOF-1 /*文件尾*/#defineNULL0 /*空指针*/#defineMIN1 /*极小值*/#defineMAX31 /*极大值*/#defineSTEP2 /*步长*/提高源程序的可修改性,修改宏定义中的“字符序列”可以起到一改全改的作用。

1、无参宏定义9.1宏定义命令格式#define宏名(参数表)带参数的字符序列调用和展开宏调用格式:宏名(实参表)宏展开:用宏调用提供的实参字符串,直接置换宏定义命令行中、相应形参字符串,非形参字符保持不变。说明定义有参宏时,宏名与左圆括号之间不能留有空格。否则,C编译系统将空格以后的所有字符均作为替代字符串,而将该宏视为无参宏。有参宏的展开,只是将实参作为字符串,简单地置换形参字符串,而不做任何语法检查。在定义有参宏时,在所有形参外和整个字符串外,均加一对圆括号。2、有参宏定义9.1宏定义命令有参宏与有参函数的区别(1)调用有参函数时,先计算实参表达式的值,然后再传给形参。而展开有参宏时,不计算实参表达式的值,只将实参简单地替换形参。(2)有参函数中,实参和形参需要定义类型,且类型一致;而有参宏中,形参是没有类型的,因此用于替换的实参,什么类型都可以。(3)无论调用多少次有参函数,都不会使目标程序变长,但每次调用都要占用系统时间进行调用现场的保护和恢复;而有参宏,由于宏展开是在编译预处理时进行的,所以不占运行时间,但是每使用一次,都会使目标程序增大。(4)有参函数在程序运行时进行值的处理,需要分配临时的内存单元;而有参宏展开是编译预处理时进行,展开时不分配内存单元,不进行值的传递处理。宏定义中,对参数是否加括号是有区别的。#definePOWER(x)((x)*(x))若a=4,b=6,则POWER(a+b)=((4+6)*(4+6))=100#definePOWER(x)(x*x)若a=4,b=6,则POWER(a+b)=(4+6*4+6)=34

9.1宏定义命令定义一个源文件可以将另一个源文件的全部内容包含进来。格式格式一:#include"文件名"

格式二:#include<文件名>注意:(1)一般被包含文件以.h为后缀。(2)一个#include命令只能指定一个被包含文件。

(3)若file1.c包含file2.h,而file2.h又包含file3.h,则可在file1.c中有两个包含命令,且file3.h的包含命令行在file2.h的包含命令行之前。

方式一:file1.c中#include"file3.h"#include"file2.h"file2.h中可无#include"file3.h"方式二:file1.c中#include"file2.h"file2.h中#include"file3.h"

9.2文件包含命令区别使用双引号:系统首先到当前目录下查找被包含文件,如果没找到,再到系统指定的“包含文件目录”(由用户在配置环境时设置)去查找,必要时在文件名前加上所在的路径。使用尖括号:直接到系统指定的“包含文件目录”去查找。一般情况下,如果包含C语言的标准头文件,则使用这种格式。优势一个大程序,通常分为多个模块,并由多个程序员分别编程。文件包含功能,可将多个模块共用的数据(如符号常量和数据结构)或函数,集中到一个单独的文件。凡是要使用其中数据或调用其中函数的程序员,只要使用文件包含功能,将所需文件包含进来即可,不必再重复定义。9.2文件包含命令说明编译预处理时,预处理程序将查找指定的被包含文件,并将其复制到#include命令出现的位置上。常用在文件头部的被包含文件,称为“标题文件”或“头部文件”,常以h(head)作为后缀,简称头文件。在头文件中,除可包含宏定义外,还可包含外部变量定义、结构类型定义等。一条包含命令,只能指定一个被包含文件。如果要包含n个文件,则要用n条包含命令。文件包含可以嵌套,即被包含文件中又包含另一个文件。9.2文件包含命令定义根据给定的条件决定是否对某些程序进行编译。采用条件编译时,可以减少目标程序的长度。格式一#ifdef

标识符程序段1[#else程序段2]#endif功能

当“标识符”已经被#define命令定义,则编译程序段1;否则编译程序段2。其中[]中的内容,即#else部分可以省略,即:#ifdef

标识符

程序段1#endif9.3条件编译命令格式二#ifndef

标识符程序段1[#else程序段2]#endif功能

当“标识符”没有被#define命令定义,则编译程序段1;否则编译程序段2。其中[]中的内容,即#else部分可以省略。

格式与前面的#ifdef~#endif命令相同,功能恰好与之相

温馨提示

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

评论

0/150

提交评论