版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、9.1 9.1 宏定义宏定义 9.2 9.2 “文件包含文件包含”处理处理 9.3 9.3 条件编译条件编译 教学重点教学重点宏定义;宏定义;“文件包含文件包含”处理。处理。教学难点教学难点宏定义;宏定义;“文件包含文件包含”处理。处理。 目的目的: : 为了简化程序的编写,为了简化程序的编写,提高程序的可移植性、可读性、模提高程序的可移植性、可读性、模块化。块化。 C C语言设计了若干命令语言设计了若干命令编编译预处理命令,并可出现于程序当译预处理命令,并可出现于程序当中。中。处理流程处理流程: 第一次编译扫描时,将预编译命令处理完,第一次编译扫描时,将预编译命令处理完,然后再进行正式编译,
2、生成目标代码。然后再进行正式编译,生成目标代码。1. 宏定义命令宏定义命令; 有三种类型的预处理命令有三种类型的预处理命令:为了与为了与C语句区别,这些命令均以语句区别,这些命令均以“#”开头。开头。2. 文件包含命令文件包含命令; 3. 条件编译命令。条件编译命令。9.1 9.1 宏定义宏定义简化程序的书写,提高可读性、可移植性。简化程序的书写,提高可读性、可移植性。宏定义分为宏定义分为: 无参数无参数和和有参数有参数二种形式。二种形式。9.1.1 9.1.1 不带参数的宏定义不带参数的宏定义# define # define 标识符标识符 字符串表达式字符串表达式例如:例如:#includ
3、e #define L (x*x + 2*x + x)main()int x, y;printf(“ input a number:” );scanf(%d, &x);y=L*L + 2*L + 10;printf(y=%d n, y);上例中,上例中,#define L (x*x+2*x+x),在,在yL*L+2*L+10;中作;中作了宏调用。在预处理时经宏展开后该语句变为:了宏调用。在预处理时经宏展开后该语句变为:y(x*x+2*x+x)*(x*x+2*x+x)+2*(x*x+2*x+x)+10;注意几点:注意几点: (1) 宏定义是用宏名来表示一个字符串,在宏展开时又以宏定义是用宏名来表
4、示一个字符串,在宏展开时又以该字该字 符串取代宏名,只是一种简单的代换。符串取代宏名,只是一种简单的代换。 (2) 宏定义不是说明或语句,在行末不加分号。宏定义不是说明或语句,在行末不加分号。 (3) 宏定义必须写在函数之外,其作用域为宏定义命令宏定义必须写在函数之外,其作用域为宏定义命令起到源程序结束。起到源程序结束。 (4) 用引号括起来的宏名,预处理程序不对其作宏代换。用引号括起来的宏名,预处理程序不对其作宏代换。 (5)宏定义允许嵌套,在宏定义的字符串中可以使用已经宏定义允许嵌套,在宏定义的字符串中可以使用已经定义的宏名。在宏展开时由预处理程序层层代换。定义的宏名。在宏展开时由预处理程
5、序层层代换。 (6)宏名一般用大写字母表示,以便于与变量区别。宏名一般用大写字母表示,以便于与变量区别。9.1.2 9.1.2 带参数的宏定义带参数的宏定义 适用于字符串表达式序列中有变化的字符,将这部分字适用于字符串表达式序列中有变化的字符,将这部分字符可定义为参数。符可定义为参数。#define 宏名宏名(形参表形参表) 字符串字符串 带参宏定义的一般形式为:带参宏定义的一般形式为: 例如例如: #define L(x) (x*x+2*x+x) /*带参数宏定义带参数宏定义*/ 宏调用:宏调用:y=L(5); 在宏调用时,用实参在宏调用时,用实参5去代替形参去代替形参x,经预处理宏展开,经
6、预处理宏展开后的语句为:后的语句为:y=(5*5+2*5+5);例例 :#include #define MAX(a,b) (ab)?a:bmain() int x,y,max;scanf(%d%d,&x,&y);max=MAX(x,y);printf(max=%d n,max);说明:说明:上例程序中,表达式上例程序中,表达式 (ab)?a:b 由宏名由宏名MAX表示,形参表示,形参a,b均出现在条件表达式中。程序中:均出现在条件表达式中。程序中:max=MAX(x,y);为宏调用,实参为宏调用,实参x,y将代换形参将代换形参a,b。宏展开后该语句为:。宏展开后该语句为:max=(xy) ?
7、 x:y;注意几点:注意几点: (1)宏定义中,宏名和形参表之间不能有空格出现。宏定义中,宏名和形参表之间不能有空格出现。例如:例如:#define MAX (a,b)(ab)?a:b 将被认为宏名将被认为宏名MAX代表的代表的字符串是字符串是 (a,b)(ab)?a:b,是无参宏定义。,是无参宏定义。 (2)在带参宏定义中,形式参数不同于函数中的形参,带参宏在带参宏定义中,形式参数不同于函数中的形参,带参宏定义中的参数不是变量,只是在宏调用时用实参的符号去代换定义中的参数不是变量,只是在宏调用时用实参的符号去代换形参,即只是符号代换。所以,不存在值传递的问题。形参,即只是符号代换。所以,不存
8、在值传递的问题。 (3)在宏定义中的形参是标识符,而宏调用中的实参可以是在宏定义中的形参是标识符,而宏调用中的实参可以是表达式。表达式。 (4)在宏定义中的形参最好用括号括起来,以避免出错。在宏定义中的形参最好用括号括起来,以避免出错。 为了保证宏代换的正确性,应该给宏定义中的表示表达为了保证宏代换的正确性,应该给宏定义中的表示表达式的字符串加上括号,如:式的字符串加上括号,如:#define L(x) (x)*(x)+2)宏调用:宏调用:y=lL(a+5);宏代换后:宏代换后:yl(a+5)*(a+5)+2);如果字符串没有加上括号,宏代换后会得到完全不同的表达式:如果字符串没有加上括号,宏
9、代换后会得到完全不同的表达式:y=l(a+5)*(a+5)+2; (5)注意注意带参宏与带参函数的区别。带参宏与带参函数的区别。9.2 “文件包含文件包含”处理处理 C语言允许在一个文件预编译时,将另一个文语言允许在一个文件预编译时,将另一个文件原封不动地包含进来。件原封不动地包含进来。目的目的: 、当函数不在一个文件中,既可用、当函数不在一个文件中,既可用link连接连接编译后的编译后的obj文件,也可用文件,也可用“ 文件包含文件包含”方式。方式。 、当一组符号常量的定义为公用时,可作、当一组符号常量的定义为公用时,可作为一个独立的文件被其它文件包含。为一个独立的文件被其它文件包含。格式格
10、式: # include 文件名文件名# include f2.c main ( ) 例例:f1.cf2.c:预编译后预编译后::main ( ) f1.c为f2.c中的内容再进行正式编译1. 一个一个include只能写一个文件,包含多个文件需多个只能写一个文件,包含多个文件需多个include 、只在只在f1.c中用中用#include. #include f2.c #include f3.c、分别在分别在f1.c, f2.c中用中用#include 在在f1.c中中: #include f2.c 在在f2.c中中: #include f3.c2. 当当f1.c包含包含f2.c,而而f2.
11、c又包含又包含f3.c时,有两种包含形式时,有两种包含形式:3. 一般用一般用 .h 扩展名命名被包含文件。扩展名命名被包含文件。 h为为head之意以与一之意以与一般般 .c 文件区别。如系统文件区别。如系统stdio.h.系统系统 .h 文件在子目录文件在子目录INCLUDE下。下。4. #include后的文件名既可用后的文件名既可用 , 也可用也可用,两者区别,两者区别: “ ”首先在当前目录中找,然后再去标准目录中找。首先在当前目录中找,然后再去标准目录中找。 只在标准目录只在标准目录(include目录目录)中找。中找。 5. 被包含文件和包含文件最后形成一个文件。因此被包含文件和
12、包含文件最后形成一个文件。因此,全局变量全局变量作用域为整个文件。不必用作用域为整个文件。不必用extern说明。说明。9.3 条件编译条件编译 有时,有时,C程序的一部分语句是否起作用要根据程序的一部分语句是否起作用要根据一定的条件,即由条件而决定是否起作用。一定的条件,即由条件而决定是否起作用。例如例如: 、 调试程序时调试程序时,需加多条需加多条printf,但调试完则要但调试完则要一一删除。一一删除。 、 有的语句也视条件而决定其具体形式。有的语句也视条件而决定其具体形式。 条件编译命令的三种形式条件编译命令的三种形式:形式形式1 # ifdef 标识符标识符 程序段程序段1 # el
13、se 程序段程序段2 # endif功能功能:当标识符在此之前被定义过:当标识符在此之前被定义过 (即用即用#define定义过定义过),则编译程序段,则编译程序段1,否则编译程序段,否则编译程序段2。其中其中: 程序段既可为语句组,也可为命令行。程序段既可为语句组,也可为命令行。另:另:#else 后面部分可没有,但后面部分可没有,但#endif保留。保留。例例: 为了调试程序,加上以下条件编译为了调试程序,加上以下条件编译 # ifdef DEBUG printf(x=%d, y=%d, z=%d,x, y, z ); # endif只要在此之前有只要在此之前有: # define DEB
14、UG 则编译则编译 printf( x=%d, y=%d, z=%d, x, y, z);例例:/*-exp11_5.c-*/includedefine EN printf(Please input number:n)main( ) int a=123, b=456;#ifdef EN prinft(This is test :a=%dn, a);#else prinft(This is test :b=%dn, b);#endif编译时会有警告:编译时会有警告:b is assigned a value that is never used运行结果运行结果:This is test :a=1
15、23形式形式2 #ifndef 标识符标识符 程序段程序段1 #else 程序段程序段2 #endif功能功能: 与形式与形式1的条件正好相反,即的条件正好相反,即: 当标识符未当标识符未被定义,则编译程序段被定义,则编译程序段1, 否则编译程序段否则编译程序段2。例例:/*-exp11_5.c-*/includedefine EN printf(Please input number:n)main( ) int a=123, b=456;#ifndef EN prinft(This is test :a=%dn, a);#else prinft(This is test :b=%dn, b)
16、;#endif编译时会有警告:编译时会有警告:a is assigned a value that is never used运行结果运行结果:This is test :b=456形式形式3 #if 表达式表达式 程序段程序段1 #else 程序段程序段2 #endif功能功能: 当表达式当表达式 0,则编译程序段,则编译程序段1,否则编译程,否则编译程序段序段2。 例例: 输入一任意字符串,需将其全部转化为输入一任意字符串,需将其全部转化为大写字母大写字母,或者将其转化为小写字母。或者将其转化为小写字母。 只编一个程序,只编一个程序, 程序中用条件编译,决定程序中用条件编译,决定是全部转为大写字母还是小写字母。是全部转为大写字母还是小写字母。 i=0; while
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 民间工艺品制作工安全宣传水平考核试卷含答案
- 商店商品管理制度
- 剪纸工诚信测试考核试卷含答案
- 飞机环控救生内饰系统装调工操作知识强化考核试卷含答案
- 燃气具安装维修工安全宣传强化考核试卷含答案
- 井下机车运输工岗前安全规程考核试卷含答案
- 水生植物栽培工保密意识水平考核试卷含答案
- 医院患者就诊登记制度
- 教育学家论文题目及答案
- 术后失眠烦躁原因分析及护理干预
- 半导体二极管08566课件
- 安全用电企业安全用电管理培训
- GA 1186-2014机动车安全技术检验监管系统通用技术条件
- 学校食堂财务管理课件
- 小学数学北师大六年级下册一圆柱与圆锥 圆柱的切拼
- 《刘景源教授温病学》讲稿
- 小学 六年级 劳动教育《小空间大农场》第二课时 教学设计
- 秘书的人际交往
- SJG 80-2020 道路隧道设计标准-高清现行
- 山东省物业服务星级标准对照表
- 磨矿车间主厂房施工组织设计完整
评论
0/150
提交评论