版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、2022-5-71学习目标:通过本章学习应具备运用预处理命令进行程序设计的能力,掌握三种预处理命令概念及使用,学会应用预处理命令进行程序设计。问题导入:在程序设计中采取什么办法能便于程序的修改、阅读、移植和调试,也便于实现模块化程序设计,提高程序的效率呢?第第9章章 预处理命令预处理命令2022-5-72 在前面各章中,已多次使用过以“#”号开头的预处理命令。如#include、#define等。在源程序中这些命令都放在函数之外,而且一般都放在源文件的前面,它们称为预处理部分。 所谓预处理是指在进行第一遍编译之前所作的工作。预处理是语言的一个重要功能,由预处理程序负责完成。为了与一般的语句区别
2、,这些命令以符号“”开始,结尾没有分号。 C语言提供多种预处理命令,本章只介绍3种预处理命令:宏定义、文件包含和条件编译。2022-5-739.1 宏定义 在语言源程序中允许用一个标识符来表示一个字符串,称为“宏”。被定义为“宏”的标示符称为“宏名”,习惯上宏名用大写字母表示。在编译预处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去代换,称为“宏代换”或“宏展开”。 宏定义是由源程序中的宏定义命令完成的,宏代换是由预处理程序自动完成的。在语言中,宏定义命令#define有两种形式:不带参数和带参数的宏定义。2022-5-749.1.1 不带参数的宏定义【语法格式】#define 标识
3、符 字符串【功能】程序编译之前,预处理程序将程序中该宏定义之后出现的所有宏名用指定的字符串进行替换。在源程序通过编译之前,C的编译程序先调用C预处理程序对宏定义进行检查,每发现一个标识符,就用相应的字符串替换。只有在完成了这个过程之后,才将源程序交给编译系统。例如: #define M x*(y+3)定义M表达式为x*(y+3),在编写源程序时,所有的x*(y+3)都可由M代替,而对源程序作编译时,将先由预处理程序进行宏代换,即用x*(y+3)表达式去置换所有的宏名M,然后再进行编译。2022-5-75【说明】(1)宏定义不是语句,在行末不必加分号,如果加上分号则连分号也一起置换。例如:#de
4、fine M x*(y+3);则M表达式为:x*(y+3); 与上例是不同的。(2)宏定义必须写在函数之外,其作用域为宏定义命令起到源程序结束。如要终止其作用域可使用#undef命令。例如:#define PI 3.14159main() #undef PI /*PI的作用域在此结束*/f1()表示PI只在main函数中有效,在f1中无效。2022-5-76(3)宏名在源程序中若用引号括起来,则预处理程序不对其作宏代换。例如:#define student 100printf(student); 程序的运行结果为:student这表示把“student”当字符串处理。(4)宏定义允许嵌套,在宏
5、定义的字符串中可以使用已经定义的宏名。在宏展开时由预处理程序层层代换。例如:#define PI 3.1415926#define S PI*y*y PI是已定义的宏名,S宏代换后变为3.1415926*y*y。(5)习惯上宏名用大写字母表示,以便于与变量区别,但也允许用小写字母。2022-5-77(6)使用宏定义有时可以减少书写麻烦。【例9.1】不带参数的宏定义应用示例。#define P printf#define D %dn#define F %fnmain() int a=5,c=8,e=11; float b=3.8,d=9.7,f=21.08; P(D F,a,b); P(D F,
6、c,d); P(D F,e,f); 2022-5-789.1.2 带参数的宏定义 带参数的宏定义是指不仅用一个指定的标识符来代表一个字符串,而且还要参数的替换。在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数。对带参数的宏,在调用中,不仅要宏展开,而且要用实参去代换形参。1、宏定义【语法格式】#define 宏名(形参表) 字符串 例如:#define M(y) y*y+3*y2、宏调用【语法格式】宏名(实参表);【功能】预处理程序将程序中出现的所有带实参的宏名展开成由实参组成的字符串。例如: k=M(5); 在宏调用时,用实参5去代替形参y,经预处理宏展开后的语句为:k=5*5+3
7、*5;。2022-5-79【说明】(1)带参数宏定义中,宏名和形参表之间不能有空格出现。(2)在带参数宏定义中,形式参数不分配内存单元,因此不必作类型定义。而宏调用中的实参有具体的值。要用它们去代换形参,因此必须作类型说明。(3)在宏定义中的形参是标识符,而宏调用中的实参可以是表达式。(4)如果宏的实参使用表达式,则在宏定义时,对应的形参应加圆括号。例如:#define a(r) 3.14*(r)*(r)s=a(3+1);上例中语句s=a(3+1);进行宏替换后为:s=3.14*(3+1)*(3+1);结果是计算半径为3+1的圆的半径。【例9.2】带参数的宏定义应用示例。#define s(a
8、,b) a+bmain()int x,y,z; x=3; y=4; z=2*s(x,y); printf(%d,z);运行结果:102022-5-7109.2 “文件包含”处理文件包含的一般形式为:【语法格式】#include 文件名 或 #include 【功能】把指定的文件插入该命令行位置取代该命令行,从而把指定的文件和当前的源程序文件连成一个源文件。在前面本书已多次用此命令,即包含库函数的头文件。例如: #include stdio.h /*标准输入输出文件*/#include math.h /*数学库函数文件*/#include string.h /*字符串操作函数文件*/2022-5
9、-711【说明】(1)包含命令中的文件名可以用双引号括起来,也可以用尖括号括起来。例如:#include stdio.h或 #include #include math.h 或 #include 以上写法都是允许的。 包含文件用双引号括住,系统是在本程序文件所在的磁盘和路径下寻找包含文件;若找不到,再按尖括号方式查找。包含文件用尖括号括住,则到存放c库函数头文件所在的目录查找要包含的文件。为了减少包含文件出错,通常使用双引号方式。(2)一个include命令只能指定一个被包含文件, 若有多个文件要包含,则需用多个include命令。2022-5-712(3)包含文件可以将多个源程序清单合并成一
10、个源程序清单。 例如:有3个源程序文件p1.c、p2.c、p3.c共同完成一项任务。p1.C语言程序:f1()p2.C语言程序:f2()p3.C语言程序:main() 以上3个程序不能单独编译,否则会发生编译错误,可将p3.C语言程序改成如下程序:#includep1.c#include p2.cmain()2022-5-7139.3 条件编译 条件编译有4种。(1)第1种形式【语法格式】#ifdef 标识符 程序段1 #else 程序段2 #endif 【功能】如果标识符已被 #define命令定义过则对程序段1进行编译,否则对程序段2进行编译。(2)第2种形式 【语法格式】#ifndef 标识符 程序段1 #else 程序段2 #endif 【功能】如果标识符未被#define命令定义过则对程序段1进行编译,否则对程序段2进行编译。这与第1种形式的功能正相反。 (
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 机场工程解除合同说明
- 国际模特签证管理与实施办法
- 游戏厅装修施工合同范本
- 汽车工人施工合同
- 医务室药品使用反馈机制
- 医疗服务项目
- 智能眼镜网线铺设协议
- 签约合同审核要点
- 电力设施外墙施工合同范本
- 塑料厂扩建工程补充合同
- 急诊科护士的沟通技巧与患者关怀
- 应对突发事件的应急响应与复盘总结
- 施工管理的成本控制与成本管理
- 《重大危险源界定》课件
- 人工智能的道德与伦理问题
- 二手车市场项目招商引资方案
- 某部营房改造装修施工组织设计
- 新媒体视听节目制作 第三章 新媒体视听节目的“策划之道”
- 顺丰快递薪酬管理案例分析
- 浙江省杭州市西溪中学2023-2024学年八年级上学期期中科学试卷
- 2023年2月抗菌药物临床应用监测与评估报告
评论
0/150
提交评论