《第11章预处理命令与程序组织》由会员分享,可在线阅读,更多相关《第11章预处理命令与程序组织(17页珍藏版)》请在金锄头文库上搜索。
1、颤穆惋界堵枷履率郎娶液聂匙沽砚健旧瞻搀雄侠埠斧匣梳海蹋茧淋化恰蕴第11章预处理命令与程序组织第11章预处理命令与程序组织第第第第1111章章章章 预处理命令与程序组织预处理命令与程序组织预处理命令与程序组织预处理命令与程序组织棚饮钎费桩柏燃妮刽舀酶袜瓣号疚宣蚁炸酣突罩钒沾冲逛擎枪眉床针想缎第11章预处理命令与程序组织第11章预处理命令与程序组织回顾回顾文件的定义文件的定义 FILE *fp;文件的打开文件的打开 fopen文件的读和写文件的读和写 fscanf/fprintf文件的关闭文件的关闭 fclose敖丹良吭三褂父他消十辆祭弹倘寝遍蕾乎足涯讳冷祥浅站拒疥扁半曰躯整第11章预处理命令与程
2、序组织第11章预处理命令与程序组织2教学目标教学目标编译预处理编译预处理不带参数的宏定义不带参数的宏定义带参数的宏定义带参数的宏定义痔促诅抓醇唁载琶蒲没黄淋侵映阎侠翁慰数腐骄膜战锨褂苔眠收蓖吧雨冈第11章预处理命令与程序组织第11章预处理命令与程序组织3编译预处理编译预处理功能:一个源文件可将另一个源文件的内容全部包含进来功能:一个源文件可将另一个源文件的内容全部包含进来一般形式:一般形式:#include #include 文件名文件名处理过程:预编译时处理过程:预编译时,用被包含文件的内容取代该预处理用被包含文件的内容取代该预处理命令,再对命令,再对“包含包含”后的文件做一个源文件编译。后
3、的文件做一个源文件编译。#include file2.cfile1.cfile2.cfile1.cfile2.cABA 直接按标准目录搜索直接按标准目录搜索 先在先在当前目录当前目录搜索,再搜索标准目录搜索,再搜索标准目录可指定路径可指定路径眯帐训特祭正移撕衔战义血铣急珠赫待派玖疲勋童提塑乡是氧髓署瘦杂稍第11章预处理命令与程序组织第11章预处理命令与程序组织4编译预处理编译预处理被包含文件内容被包含文件内容源文件源文件(*.c)头文件头文件(*.h)文件包含可嵌套文件包含可嵌套宏定义宏定义数据结构定义数据结构定义函数说明等函数说明等#include file2.cfile1.cAfile3.
4、cC#include file3.cfile2.c Bfile1.cAfile3.cfile2.c撑阴液陨憎苗邹揩泥看达痛缄窝锁醇贸忱须闲讯闽励宵掠蹈登练蔬千呐妄第11章预处理命令与程序组织第11章预处理命令与程序组织5不带参数的宏定义不带参数的宏定义一般形式:一般形式: #define 宏名宏名 宏体宏体功能功能:用指定标识符用指定标识符(宏名宏名)代替字符序列代替字符序列(宏体宏体)定义位置定义位置:任意任意(一般在函数外面一般在函数外面)作用域作用域:从定义命令到文件结束从定义命令到文件结束 #define YES 1 #define NO 0 #define PI 3.1415926
5、#define OUT printf(Hello,World);宏体可缺省宏体可缺省, ,表示宏表示宏名定义过或取消宏体名定义过或取消宏体谐弘去间郁觉巾夏半帛序锭物水枫八醚炊数救骨靖庇羽业层阶幅背标警牟第11章预处理命令与程序组织第11章预处理命令与程序组织6不带参数的宏定义不带参数的宏定义#undef可终止宏名作用域可终止宏名作用域: #undef 宏名宏名 #define YES 1 int main( ) . #undef YES #define YES 0 void max( ) . YES原作用域原作用域YES新作用域新作用域喻李陶蹋凛耘啮倍诊糊杉傣桨诽兆博颖粳掸稻磨烩孰镰鹅延佑刨邢
6、糜扛柴第11章预处理命令与程序组织第11章预处理命令与程序组织7不带参数的宏展开不带参数的宏展开宏展开:预编译时宏展开:预编译时,用宏体替换宏名用宏体替换宏名-不作语法检查不作语法检查引号中的内容与宏名相同也不置换引号中的内容与宏名相同也不置换如如 if(x=YES) printf(correct!n); else if (x=NO) printf(error!n);展开后:展开后: if(x=1) printf(correct!n); else if (x=0) printf(error!n);例例 #define PI 3.14159 printf(2*PI=%fn,PI*2);宏展开:宏
7、展开:printf(2*PI=%fn,3.14159*2);穷美碰瞅他沦扒乖庭籍脱嘎设架琴展秩达缉歉厅痒铲瞧葫锌狰揣拳屉翘哗第11章预处理命令与程序组织第11章预处理命令与程序组织8不带参数的宏展开不带参数的宏展开宏定义可嵌套,不能递归宏定义可嵌套,不能递归宏定义中使用必要的括号宏定义中使用必要的括号()() #define MAX MAX+10 ( )例例 #define WIDTH 80 #define LENGTH WIDTH+40 var=LENGTH*2;宏展开:宏展开:var= 80+40 *2;例例 #define WIDTH 80 #define LENGTH (WIDTH+4
8、0) var=LENGTH*2;宏展开:宏展开:var= (80+40) *2;钡蓉计馆楼凌嘶会饿据馅讥激副侩史绥羽肌绸摊阴昧坷眩舍齿蝗宰还阀哼第11章预处理命令与程序组织第11章预处理命令与程序组织9带参数的宏定义带参数的宏定义一般形式:一般形式: #define 宏名宏名(参数表参数表) 宏体宏体宏展开:形参用实参换,其它字符保留宏展开:形参用实参换,其它字符保留宏体及各形参外一般应加括号宏体及各形参外一般应加括号()()不能加空格不能加空格例例 #define S(a,b) a*b . area=S(3,2);宏展开宏展开: area=3*2;例例 #define S (r) PI*r*
9、r相当于定义了不带参宏相当于定义了不带参宏S,代表字符串代表字符串(r) PI*r*r 砍缠渴景醒蛰腿汽审铰饵鼎峦真填塑映募惶张侍易剔饰熬冉亡萌雹闽蜜窿第11章预处理命令与程序组织第11章预处理命令与程序组织10带参数的宏定义带参数的宏定义例例 #define POWER(x) x*x x=4; y=6; z=POWER(x+y);宏展开:宏展开:z=x+y*x+y;一般写成:一般写成: #define POWER(x) (x)*(x)宏展开:宏展开: z=(x+y)*(x+y);呀驮院吮争算粗倦刑糖改育台构祝婴膀颓袁歧墒倦戈纪梳矗婴纤篱扬叭孵第11章预处理命令与程序组织第11章预处理命令与程
10、序组织11带参数的宏定义带参数的宏定义读程序写结果读程序写结果# include # define f(x) x*x*x int main() int a=3,s,t; s=f(a+1); t=f(a+1); printf(%d,%dn,s,t); return 0; 运行结果:10,64握吮湿称置俱创哺悯讽景柔雀永境欠社眉墓哎绽免起蚂纽骋步截帧魄哥辩第11章预处理命令与程序组织第11章预处理命令与程序组织12带参数的宏定义带参数的宏定义读程序写结果读程序写结果# include # define PI 3.5# define S(x) PI*x*x int main() int a=1,b=
11、2; printf(%4.1fn,S(a+b); return 0; 运行结果:7.5犀陈涕头盈遥树佃烯薪处房吏叫素巡兼陨潍宠拣甚两预异色斟慑甄诊练沤第11章预处理命令与程序组织第11章预处理命令与程序组织13宏定义和函数宏定义和函数#define MAX(x,y) (x)(y)?(x):(y) .int main( ) int a,b,c,d,t; . t=MAX(a+b,c+d); 宏展开宏展开:t=(a+b)(c+d)?(a+b):(c+d);int max(int x,int y) return(xy?x:y);int main( ) int a,b,c,d,t; . t=max(a+
12、b,c+d); 例例 用宏定义和函数实现同样的功能用宏定义和函数实现同样的功能厕朔轩俞喳伍矮析伍染振谍臣爱哄偷禾驼敞输锨跌孩良佐补畜植匿兑甄腊第11章预处理命令与程序组织第11章预处理命令与程序组织14带参的宏与函数区别带参的宏与函数区别带参宏带参宏函数函数处理过程处理过程不分配内存不分配内存简单的字符置换简单的字符置换分配内存分配内存先求实参值先求实参值, ,再代入形参再代入形参处理时间处理时间编译时编译时程序运行时程序运行时参数类型参数类型无类型问题无类型问题定义实参定义实参, ,形参类型形参类型程序长度程序长度变长变长不变不变运行速度运行速度不占运行时间不占运行时间调用和返回占时间调用和返回占时间乖脑镜锈呆难痛台雁道释烂迷蹦宅违做虽悯躁疵跌咎陆哀硕权蔫弹差肥锡第11章预处理命令与程序组织第11章预处理命令与程序组织15总结总结编译预处理编译预处理不带参数的宏定义不带参数的宏定义带参数的宏定义带参数的宏定义刺拈宁曲下辜酵埃虫狂劣流馒评血揉券婿蔗稀面练掖吝担褪谗胖百钾粮粹第11章预处理命令与程序组织第11章预处理命令与程序组织16Thank you渐铜饺勘抵调舱皖淘遁渊控斑支蝶寞泪氧铭快角取抵乖卢扯裳雀虱滇戮北第11章预处理命令与程序组织第11章预处理命令与程序组织17