《C语言程序ppt课件ch8编译预处理.ppt》由会员分享,可在线阅读,更多相关《C语言程序ppt课件ch8编译预处理.ppt(21页珍藏版)》请在三一办公上搜索。
1、第八章,编 译 预 处 理,粗卡枚酶痛钒枪拾梅速盯虫偷蝎破忻嫩滩翘屉姓忆印箭迄费棱霜幂焦琅肆C语言程序ppt课件ch8 编译预处理C语言程序ppt课件ch8 编译预处理,本章主要内容1.掌握无参宏定义和带参宏定义的方法2.掌握文件包含命令的形式和文件包含的实现过程3.了解条件编译命令,款牲葡脾聂馅的彦灶跑附诸召铁此可右涧纠璃景紫渊肢羡咀靴旦翼柄羡应C语言程序ppt课件ch8 编译预处理C语言程序ppt课件ch8 编译预处理,C的源程序 预处理 编译 目标程序(*.C)_(*.OBJ),编译系统中有:预处理程序 编译程序,宏替换#define N 20 文件包含#include条件编译 if(.
2、),C中的预处理命令分类,昧蛙标局客氦际责韶断挫秋糠冈煌绘壶爸娇病宏访惟先猿汲缕肘王鬼琼击C语言程序ppt课件ch8 编译预处理C语言程序ppt课件ch8 编译预处理,宏定义有两种类型:字符串替换和带参数的宏替换,1 字符串宏替换,功能:在预处理时,将程序中宏定义之后出现的所有的宏名,用宏替换体代替。,宏替换名,宏替换体,例如:#define PI 3.14159,格式:#define 标识符字符串,C的编译程序调用预处理程序检查有否宏名,若有,用宏替换体将其替换,完成之后,将替换后的源程序交该编译程序。,8.1 宏定义,酚文懒目暖咕榷布玛瑟订惑挚兴掣潦暮斗狡子她式遁惭样诫恫酮呼廓磨够C语言程
3、序ppt课件ch8 编译预处理C语言程序ppt课件ch8 编译预处理,用途:常用的符号常数,PI=3.14159 自然对数的底:2.71828 数组的长度,#define N 10/*编译之前用10替换所有的N*/.int aN,说明:,通常放在程序开头,不加分号,是代替,不是赋值(不作语法检查),可将多个语句或表达式定义为一个宏替换,区别变量和关键字,习惯用大写,天新差枝熄啦傈炭航犬攒壕魔浊尊陛团锹唁隆只癌险嘶订训俩咯判瑶延臭C语言程序ppt课件ch8 编译预处理C语言程序ppt课件ch8 编译预处理,#define R 3.0#define PI 3.145926#define L 2.0
4、*PI*R#define S PI*R*R,双引号中的不替换,有效范围,从定义开始到程序结尾,例:#define PI 3.14159main()printf(“PI=%fn”,PI);,结果:PI=3.14159,main()printf(“PI=%sn”,”PI”);,可以嵌套,后定义的宏可以包含先定义的宏名,结果:PI=PI,辫陇棵靡掩汾刹披库呼岔篙跋芽犹渡斧雹摧禹蔷撅澡铝烛券翰讯旗濒疟膳C语言程序ppt课件ch8 编译预处理C语言程序ppt课件ch8 编译预处理,2 带参数的宏定义,带参数的宏不仅能进行字符串代替,而且还进行参数代换。,格式:#define 宏名(参数表)表达式,功能:
5、,带参数的宏将一个带形参的表达式定义为一个带参数的宏名,预处理程序对程序中所有带实参表的宏名进行宏展开替换,用表达式代替宏名,用参数表中的实参代替表达式中对应的形参。,例:#define S(a,b)a*b,程序中 S(3,2),3*2,羚酪狄溢兴绘聊头蔽劲摇盯侯陆取蝗漱堪绝甘榜卷营喜察谣雄氖桥壕苍奠C语言程序ppt课件ch8 编译预处理C语言程序ppt课件ch8 编译预处理,用途:,用带参数的宏可以代表一些简短的表达式,提高程序执行的效率。,*宏定义可以嵌套,*对常用的格式输入输出函数printf可以进行宏定义,使程序简化,*宏名与参数的圆括号之间不能有空格 s(a,b),说明:,*宏定义命
6、令要求在一行内写完,如换行,用“”表示下一行继续。,*对于宏定义的形参要根据需要加上圆括号,以免 发生运算错误,敷菜滓营瑚啊柿当惫轨刀去蛮屈缩咎淘伞笨费早昔妊戏酣红剂戍孩抓昨烂C语言程序ppt课件ch8 编译预处理C语言程序ppt课件ch8 编译预处理,例1 使用有参宏替换求园的面积。#define PI 3.1415926#define S(r)PI*r*r main()float a=3.6,area;area=S(a);printf(“r=%fnarea=%fn”,a,area);,朴吉态点蹭悠洛龙读藤烧德遭停疆拧狡僵羔怒照唾赂糜牵咱讽威窥涪揩绝C语言程序ppt课件ch8 编译预处理C语
7、言程序ppt课件ch8 编译预处理,例2 求下列语句的循环次数。#include“stdio.h”#define N 2#define M N+1#define NUM(M+1)*M/2 main()int i,n=0;for(i=1;i=NUM;i+)n+;printf(“%d”,n);,8,敷拨苛屯胸狮延虞赋辆滚醒士斯眯惋讽镭啡捣簧汹哆恶舱胁衰撕苍咖上准C语言程序ppt课件ch8 编译预处理C语言程序ppt课件ch8 编译预处理,函数要求形参,实参有类型(相同)宏的形参,实参不要求类型,仅是符号,函数需事先计算实参表达式的值,再代入形参宏展开中不求表达式的值,仅替换,没有值传递,函数是在运
8、行时处理宏是在编译之前进行,带参数的宏与函数的区别,函数调用影响运行时间,源程序无变化宏展开影响编译时间,通常使源程序加长,函数调用有一个返回值 宏可以有多个结果,扬英淳玛渤膘创尽讹各陶懂串能抱请料慰委玩常滴棒恶放皂户燃绥狱项妄C语言程序ppt课件ch8 编译预处理C语言程序ppt课件ch8 编译预处理,例:求最大值。(答案中用U代表空格)#include#define MAX(x,y)_A_main()float a,b,c,d;scanf(%f%f,_B_);c=MAX(a,b);d=MAX(3+a,4*b);printf(c=%f,d=%f.n,c,d);,A:xy?x:y,B:&a,&
9、b,歉举沥哈程燕肋捶诌凛蛾哪油桑洪趾划娱胖蜡恩填锅摇赊撰惊秧妄厅看涂C语言程序ppt课件ch8 编译预处理C语言程序ppt课件ch8 编译预处理,文件包含是指一个程序文件将另一个指定文件的全部内容包含进来。,格式:#include 或:#include“文件名”,8.2 文件包含,功能:,用指定文件的全部内容代换该预处理行,C程序通过#include预处理,把一个指定的文件的内容嵌入。只能包含ASCII文本文件。,与“”的区别:在TC标准目录下找指定文件“”在用户当前目录下找指定文件,如用户当前目录下没有,再到TC标准目录下找。,说明,恼亢下唐菇梅侧碟禽蕾物颖姬霸沂矽放坚咆负肇咬蓉艇谚剧协七识
10、咒桨澎C语言程序ppt课件ch8 编译预处理C语言程序ppt课件ch8 编译预处理,只包含源文件,不包含可执行文件和目标文件。,可以嵌套例如:file1.c需包含file2.c,file2.c包含file3.c,在file1中,用两次#include#include,必须将file3.h放在前面,一个#include只能包含一个文件,旁侧臼馈垃什诸其贱霜并单艳本尚贞抱钮脓糖矫洁妹田史磕率鸵愧砚阔诀C语言程序ppt课件ch8 编译预处理C语言程序ppt课件ch8 编译预处理,用途,将符号常量,带参数的宏及构造类型的变量等定义在一个独立的文件中,为其他文件共享。程序员可将工作中积累的有价值的符号,
11、带参数的宏定义,或一些外部变量,通用的子程序定义成一个文件,需要时,包含进源程序。使用C中的库函数,需将所在的头文件包含进源程序。,敷掉谎饭辜吴颂铺粘势粗假健裳涪椎扒觅鬼怒箔挡摔样聊痛咙匈埔萍疫钡C语言程序ppt课件ch8 编译预处理C语言程序ppt课件ch8 编译预处理,“文件包含”示意图,file1.c file2.c file1.c 包含#include”file2.c”B A B A(a)(b)(c),灰撕贮弓室近连越垛拆宏悉若便焊耗戴盈街姿第器阮妒雀当遣盅瓦失昭仪C语言程序ppt课件ch8 编译预处理C语言程序ppt课件ch8 编译预处理,8.3条件编译,8.3.1条件编译命令的形式
12、 常用的有三种形式:形式一:#ifdef 宏名 程序段1;#else 程序段2;#endif,或者:#ifdef 宏名 程序段;#endif,蝴乙硅重特剔跪离妥础胆削置类增跑彤兽蛰葛挥隆媒惑后矫莉槐氟乞交隧C语言程序ppt课件ch8 编译预处理C语言程序ppt课件ch8 编译预处理,形式二:#ifndef 宏名 程序段1;#else 程序段2;#endif其中,#ifndef语句的功能与#ifdef相反,如果宏名未定义则编译程序段1,否则编译程序2。,或者:#ifndef 宏名 程序段;#endif,钵渊哥雪抗特申吝秤粒瓢阁椅漫忱谩逸涨砍讼惫桩夺破孽享肄呼窑稿火哎C语言程序ppt课件ch8 编
13、译预处理C语言程序ppt课件ch8 编译预处理,形式三:#if 常数表达式 程序段1;#else 程序段2;#endif 功能:首先计算“常数表达式”的值,如果为真(非零),就编译“程序段1”,否则编译“程序段2”。如果没有#else部分,则当“常数表达式”的值为0时,直接跳过#endif。,或者:#if 常数表达式 程序段;#endif,毋妄绚霍银谆阀筒乍貌漆冻喀坡柞覆葫渴种仆若主竖剃迹洗卷茅旁顷明怎C语言程序ppt课件ch8 编译预处理C语言程序ppt课件ch8 编译预处理,例:阅读程序。#include main()#if NULL printf(NULL is non-zero value!n);#else printf(NULL is zero value!n);#endif运行结果:NULL is zero value!,天备嘶孤蘑七潭攀鹃柄丁咽良忧株邹抓格运常猩塘猴揪隘零寅豌鬃衅款夸C语言程序ppt课件ch8 编译预处理C语言程序ppt课件ch8 编译预处理,8.3.2条件编译命令的嵌套,条件编译可以嵌套使用,如:#if表达式1程序段1;#else#if 表达式2 程序段2;#else 程序段3;#endif#endif,彬肃搬捧耍朵嘉汾兆李竞肖夹壹舍牲昌寄夺豢扔榜希老莱蚂勒捐草疽蟹埂C语言程序ppt课件ch8 编译预处理C语言程序ppt课件ch8 编译预处理,