《预处理命令与程序组织.PPT》由会员分享,可在线阅读,更多相关《预处理命令与程序组织.PPT(17页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第第第1111章章章章 预处理命令与程序组织预处理命令与程序组织预处理命令与程序组织预处理命令与程序组织回顾回顾文件的定义文件的定义 FILE *fp;文件的打开文件的打开 fopen文件的读和写文件的读和写 fscanf/fprintf文件的关闭文件的关闭 fclose2教学目标教学目标编译预处理编译预处理不带参数的宏定义不带参数的宏定义带参数的宏定义带参数的宏定义3编译预处理编译预处理功能:一个源文件可将另一个源文件的内容全部包含进来功能:一个源文件可将另一个源文件的内容全部包含进来一般形式:一般形式:#include#include 文件名文件名处理过程:预编译时处理过程:预编译时,用
2、被包含文件的内容取代该预处理用被包含文件的内容取代该预处理命令,再对命令,再对“包含包含”后的文件做一个源文件编译。后的文件做一个源文件编译。#include file2.cfile1.cfile2.cfile1.cfile2.cABA 直接按标准目录搜索直接按标准目录搜索 先在先在当前目录当前目录搜索,再搜索标准目录搜索,再搜索标准目录可指定路径可指定路径4编译预处理编译预处理被包含文件内容被包含文件内容源文件源文件(*.c)头文件头文件(*.h)文件包含可嵌套文件包含可嵌套宏定义宏定义数据结构定义数据结构定义函数说明等函数说明等#include file2.cfile1.cAfile3.c
3、C#include file3.cfile2.c Bfile1.cAfile3.cfile2.c5不带参数的宏定义不带参数的宏定义一般形式:一般形式:#define 宏名宏名 宏体宏体功能功能:用指定标识符用指定标识符(宏名宏名)代替字符序列代替字符序列(宏体宏体)定义位置定义位置:任意任意(一般在函数外面一般在函数外面)作用域作用域:从定义命令到文件结束从定义命令到文件结束#define YES 1#define NO 0#define PI 3.1415926#define OUT printf(Hello,World);宏体可缺省宏体可缺省,表示宏表示宏名定义过或取消宏体名定义过或取消宏
4、体6不带参数的宏定义不带参数的宏定义#undef可可终止宏名作用域终止宏名作用域:#undef 宏名宏名#define YES 1 int main().#undef YES#define YES 0 void max().YES原作用域原作用域YES新作用域新作用域7不带参数的宏展开不带参数的宏展开宏展开:预编译时宏展开:预编译时,用宏体替换宏名用宏体替换宏名-不作语法检查不作语法检查引号中的内容与宏名相同也不置换引号中的内容与宏名相同也不置换如如 if(x=YES)printf(correct!n);else if(x=NO)printf(error!n);展开后:展开后:if(x=1)p
5、rintf(correct!n);else if(x=0)printf(error!n);例例#define PI 3.14159 printf(2*PI=%fn,PI*2);宏展开:宏展开:printf(2*PI=%fn,3.14159*2);8不带参数的宏展开不带参数的宏展开宏定义可嵌套,不能递归宏定义可嵌套,不能递归宏定义中使用必要的括号宏定义中使用必要的括号()()#define MAX MAX+10 ()例例#define WIDTH 80#define LENGTH WIDTH+40 var=LENGTH*2;宏展开:宏展开:var=80+40*2;例例#define WIDTH
6、80#define LENGTH (WIDTH+40)var=LENGTH*2;宏展开:宏展开:var=(80+40)*2;9带参数的宏定义带参数的宏定义一般形式:一般形式:#define 宏名宏名(参数表参数表)宏体宏体宏展开:宏展开:形参用实参换,其它字符保留形参用实参换,其它字符保留宏体及各形参外一般应加括号宏体及各形参外一般应加括号()()不能加空格不能加空格例例#define S(a,b)a*b .area=S(3,2);宏展开宏展开:area=3*2;例例#define S (r)PI*r*r相当于定义了不带参宏相当于定义了不带参宏S,代表字符串代表字符串(r)PI*r*r 10带
7、参数的宏定义带参数的宏定义例例#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带参数的宏定义带参数的宏定义读程序写结果读程序写结果#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,6412带参数的宏定义带参数的宏定义读程序写结果读程序写结果#include#de
8、fine PI 3.5#define S(x)PI*x*x int main()int a=1,b=2;printf(%4.1fn,S(a+b);return 0;运行结果:7.513宏定义和函数宏定义和函数#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+b,c+d);例例 用宏定义和函数实现同样的功能用宏定义和函数实现同样的功能14带参的宏与函数区别带参的宏与函数区别带参宏带参宏函数函数处理过程处理过程不分配内存不分配内存简单的字符置换简单的字符置换分配内存分配内存先求实参值先求实参值,再代入形参再代入形参处理时间处理时间编译时编译时程序运行时程序运行时参数类型参数类型无类型问题无类型问题定义实参定义实参,形参类型形参类型程序长度程序长度变长变长不变不变运行速度运行速度不占运行时间不占运行时间调用和返回占时间调用和返回占时间15总结总结编译预处理编译预处理不带参数的宏定义不带参数的宏定义带参数的宏定义带参数的宏定义16Thank you17