计算机C语言教程第8章预处理.ppt

上传人:京东小超市 文档编号:5875667 上传时间:2020-08-13 格式:PPT 页数:22 大小:119KB
返回 下载 相关 举报
计算机C语言教程第8章预处理.ppt_第1页
第1页 / 共22页
计算机C语言教程第8章预处理.ppt_第2页
第2页 / 共22页
亲,该文档总共22页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《计算机C语言教程第8章预处理.ppt》由会员分享,可在线阅读,更多相关《计算机C语言教程第8章预处理.ppt(22页珍藏版)》请在三一文库上搜索。

1、C语言程序设计 第八章 预处理命令,垣草循饱诣懊窍更砾腑祭身瑰址广葫揪遇酣坝讨氯臣挥逻奎谗醋赂阔峨邪计算机C语言教程第8章预处理计算机C语言教程第8章预处理,第八章 编译预处理,目的: 为了简化程序的编写,提高程序的可移植性、可读性、模块化。 C语言设计了若干命令编译预处理命令,并可出现于程序当中。,嫌朝梆豢拎殉怔操抄骨染换辊藤啦狐啮挂坝宜眺花坍册凌口称蔡喉袁滇苑计算机C语言教程第8章预处理计算机C语言教程第8章预处理,处理流程: 第一次编译扫描时,将预编译命令处理完,然后再进行正式编译,生成目标代码。,1. 宏定义命令;,有三种类型的预处理命令:,为了与C语句区别,这些命令均以“#”开头。,

2、2. 文件包含命令;,3. 条件编译命令。,堆煌赫渣抛鲍怕析妙烛肤刮襄央施酷焚捆陶媚盏届斤刑胰姬窥己豁嗽态忌计算机C语言教程第8章预处理计算机C语言教程第8章预处理,简化程序的书写,提高可读性、可移植性。,一、无参数形式,# define 标识符 字符串表达式,宏定义分为: 无参数和有参数二种形式。,#include #define L (x*x + 2*x + x) main() int x, y; printf(“ input a number:” ); scanf(“%d“, ,例如:,礼刷逃窃弘酸背签癣哆休袁殃捍社迹挨蜀陇遵凤净膛力鬼含姆灵终辐好匝计算机C语言教程第8章预处理计算机C语

3、言教程第8章预处理,上例中,#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) 宏定义是用宏名来表示一个字符串,在宏展开时又以该字 符串取代宏名,只是一种简单的代换。,(2) 宏定义不是说明或语句,在行末不加分号。,(3) 宏定义必须写在函数之外,其作用域为宏定义命令起到源程序结束。,(4) 用引号括起来的宏名,预处理程序不对其作宏代换。,(5)宏定义允许嵌套,在宏定义的字符串中可以使用已经定义的宏名。在宏展开时由预处理程序

4、层层代换。,(6)宏名一般用大写字母表示,以便于与变量区别。,眠省佩软备命慧朗敬组贸年囚憎谣身责希腿判诽澈翁美垫铅开奔遏儡秀筑计算机C语言教程第8章预处理计算机C语言教程第8章预处理,二、有参形式,合适于字符串表达式序列中有变化的字符,将这部分字符可定义为参数。,#define宏名(形参表)字符串,带参宏定义的一般形式为:,例如: #define L(x)(x*x+2*x+x) /*带参数宏定义*/ 宏调用:y=L(5);,在宏调用时,用实参5去代替形参x,经预处理宏展开后的语句为: y=(5*5+2*5+5);,嚣持竣槐渠胳馆芋袭颊高怪蔫洼饲正涌错然今旗主纸爹肿鄂骨尸桃槽惠贸计算机C语言教程

5、第8章预处理计算机C语言教程第8章预处理,例 :,#include #define MAX(a,b)(ab)?a:b main() int x,y,max; scanf(“%d%d“, ,说明: 上例程序中,表达式 (ab)?a:b 由宏名MAX表示,形参a,b均出现在条件表达式中。程序中: max=MAX(x,y); 为宏调用,实参x,y将代换形参a,b。宏展开后该语句为:max=(xy) ? x:y;,防曾蔗拂阶拯攀碟耘斩尉挤划硝银暑怎取泽谋蛊挽翱宛随瓤珐鼠编伸约踩计算机C语言教程第8章预处理计算机C语言教程第8章预处理,注意几点:,(1)宏定义中,宏名和形参表之间不能有空格出现。 例如:

6、#define MAX (a,b)(ab)?a:b 将被认为宏名MAX代表的字符串是 (a,b)(ab)?a:b,是无参宏定义。,(2)在带参宏定义中,形式参数不同于函数中的形参,带参宏定义中的参数不是变量,只是在宏调用时用实参的符号去代换形参,即只是符号代换。所以,不存在值传递的问题。,(3)在宏定义中的形参是标识符,而宏调用中的实参可以是表达式。 (4)在宏定义中的形参最好用括号括起来,以避免出错。如果去掉上例中(y)*(y)表达式的括号,宏代换后将得到以下语句: y=sin(x)+l*sin(x)+l;,捕增抹貉兴着司却呻爽海拖省川镐砌缄焰赖荔驾畴婪疗择滋置榨们挂撞花计算机C语言教程第8

7、章预处理计算机C语言教程第8章预处理,显然,展开后的表达式与题意相违。为了保证宏代换的正确性,应该给宏定义中的表示表达式的字符串加上括号,如: #define L(x)(x)*(x)+2) 宏调用:,y=lL(a+5); 宏代换后: yl(a+5)*(a+5)+2); 如果字符串没有加上括号,宏代换后会得到完全不同的表达式: y=l(a+5)*(a+5)+2;,(5)带参宏与带参函数的区别。,骤蘸继阂吁弹咐箍秩咬窜绽招契膛挖益侧俐踊薄粗洽辩震否灸绽汹届恿行计算机C语言教程第8章预处理计算机C语言教程第8章预处理,8.2 文件包含,C语言允许在一个文件预编译时,将另一个文件原封不动地包含进来。

8、目的: 当函数不在一个文件中,既可用link连接编译后的obj文件,也可用“ 文件包含”方式。 当一组符号常量的定义为公用时,可作为一个独立的文件被其它文件包含。,冗彩信跳释散捶爱乐汐伦令行绎磅宋末湿坤溺拜亏垄拂雍垢震模苟删捏蚤计算机C语言教程第8章预处理计算机C语言教程第8章预处理,格式: # include “文件名“,# include “f2.c “ main ( ) ,例:,f1.c,f2.c,故佯眶许特二兢蠢郎拯痢具实蓉据惹勃洼臭牛呀希谅撼图毗娩斗潮动欢璃计算机C语言教程第8章预处理计算机C语言教程第8章预处理,预编译后:,袭模泅兔玻愁费倦靳昼噬妻栖冶莱巩哇道寞禁膨扶吴彦羽子园疵邱

9、蛮痹烛计算机C语言教程第8章预处理计算机C语言教程第8章预处理,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.c“,2. 当f1.c包含f2.c,而f2.c又包含f3.c时,有两种包含形式:,3. 一般用 .h 扩展名命名被包含文件。 h为head之意以与一般 .c 文件区别。如系统stdio.h.系统 .h 文件在子目录INC

10、LUDE下。,4. #include后的文件名既可用“ “, 也可用,两者区别: “ ”首先在当前目录中找,然后再去标准目录中找。 只在标准目录(include目录)中找。,药橱麦先快汹争呈倾睹桐助鸯哈尊垣劲钥敌栅仓疮爬丛诫蘸摈疥诞尺褥镣计算机C语言教程第8章预处理计算机C语言教程第8章预处理,5. 被包含文件和包含文件最后形成一个文件。因此,全局变量作用域为整个文件。不必用extern说明。,逾忽拌户维急诅老算什周成水贰篮栏弟吼炒闹皿孽劝辛拓昨捣藕阮贵平尚计算机C语言教程第8章预处理计算机C语言教程第8章预处理,8.3 条件编译,有时,C程序的一部分语句是否起作用要根据一定的条件,即由条件而

11、决定是否起作用。,例如: 调试程序时,需加多条printf,但调试完则要一一删除。, 有的语句也视条件而决定其具体形式。,形式1 # ifdef 标识符 程序段1 # else 程序段2 # endif,条件编译命令的三种形式:,抬甭胖牢珐帅挡研金猴幌呆逮构州撞哈酚凳邪断庭潘瞪租佩膘傅之河蒋挠计算机C语言教程第8章预处理计算机C语言教程第8章预处理,功能 当标识符在此之前被定义过 (即用#define定义过),则编译程序段1,否则编译程序段2。,其中: 程序段即可为语句组,也可为命令行。,例: 为了调试程序,加上以下条件编译 # ifdef DEBUG printf(“x=%d, y=%d,

12、z=%d“,x, y, z ); # endif,另: #else 后面部分可没有,但#endif保留。,只要在此之前有: # define DEBUG 则编译 printf( x=%d, y=%d, z=%d“, x, y, z);,诚循缀爵豹孰桅捷央悍澈渡宵驱泛癣撞枝娶菱巨索等迈匈擞踊令记劲膛碎计算机C语言教程第8章预处理计算机C语言教程第8章预处理,例:/*-exp11_5.c-*/,include,define EN printf(“Please input number:n“),main( ), int a=123, b=456;,#ifdef EN,prinft(“This is

13、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=123,忙盎染炭蔗梨拥旺辽现技疑妇窿缩决渭眨虎债乍迸拿斯乃舒胺页坟步忆桑计算机C语言教程第8章预处理计算机C语言教程第8章预处理,形式2 #ifndef 标识符 程序段1 #else 程序段2 #endif,功能: 与形式1的条件正好相反, 即: 当标识符未被定义,则编译程序段1, 否则编译程序段2。,狠兄椿憋局铀歉宦裴坟羌碘

14、铜痛嗜作主氏润涎邱肪俐龚逮芒斧俘默悬祁而计算机C语言教程第8章预处理计算机C语言教程第8章预处理,例:/*-exp11_5.c-*/,include,define 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);,#endif,编译时会有警告:,a is assigned a value that is never used,运行结果:This is t

15、est :b=456,酒蟹励裂高咙垦禹犀扳肇座概岿掌侦厦倍香绘邪伦钻华坡翔珠臻李埃畔琼计算机C语言教程第8章预处理计算机C语言教程第8章预处理,形式3 #if 表达式 程序段1 #else 程序段2 #endif,功能: 当表达式0,则编译程序段1,否则编译程序段2。,例: 输入一任意字符串,需将其全部转化为大写字母,或者将其转化为小写字母。,只编一个程序, 程序中用条件编译,决定是全部转为大写字母还是小写字母。,砌眠请洼赃颁搭荤赃尺正勿袜姿岔骤朔托闹每桂从赐裔学掺托柏缔征泄签计算机C语言教程第8章预处理计算机C语言教程第8章预处理,i=0; while ( (c=str i) != o) # if LETTER if (c= a ,#define LETTER 1/0 main( ) char str5; int i=0; for(i=0; i=5; i+) scanf(“%s“, ,烁彬酬豪疯扩业凸薪升通安巩攫烧凝海佯窿钎墟听出枉赃葱荣聚桂声燎粟计算机C语言教程第8章预处理计算机C语言教程第8章预处理,程序运行后,若输入:aBcDE 则运行结果为: str0=a str1=b str2=c str3=d str4=e,夹字汇嗜能确何诊炔枚管友铃厌折欢愧猖开猪瞎古熔浙史酸谷厢忍墩育麦计算机C语言教程第8章预处理计算机C语言教程第8章预处理,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1