《预处理命令与程序组织.ppt》由会员分享,可在线阅读,更多相关《预处理命令与程序组织.ppt(17页珍藏版)》请在三一办公上搜索。
1、第11章 预处理命令与程序组织,回顾,文件的定义 FILE*fp;文件的打开 fopen文件的读和写 fscanf/fprintf文件的关闭 fclose,教学目标,编译预处理不带参数的宏定义带参数的宏定义,编译预处理,功能:一个源文件可将另一个源文件的内容全部包含进来一般形式:#include#include 文件名处理过程:预编译时,用被包含文件的内容取代该预处理命令,再对“包含”后的文件做一个源文件编译。,直接按标准目录搜索 先在当前目录搜索,再搜索标准目录可指定路径,编译预处理,被包含文件内容源文件(*.c)头文件(*.h)文件包含可嵌套,宏定义数据结构定义函数说明等,不带参数的宏定义
2、,一般形式:#define 宏名 宏体功能:用指定标识符(宏名)代替字符序列(宏体)定义位置:任意(一般在函数外面)作用域:从定义命令到文件结束,#define YES 1#define NO 0#define PI 3.1415926#define OUT printf(Hello,World);,宏体可缺省,表示宏名定义过或取消宏体,不带参数的宏定义,#undef可终止宏名作用域:#undef 宏名,不带参数的宏展开,宏展开:预编译时,用宏体替换宏名-不作语法检查引号中的内容与宏名相同也不置换,如 if(x=YES)printf(correct!n);else if(x=NO)printf
3、(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);宏展开:printf(2*PI=%fn,3.14159*2);,不带参数的宏展开,宏定义可嵌套,不能递归宏定义中使用必要的括号(),#define MAX MAX+10(),例#define WIDTH 80#define LENGTH WIDTH+40 var=LENGTH*2;宏展开:var=80+40*2;,例#define WIDTH 80#define LENGTH(
4、WIDTH+40)var=LENGTH*2;宏展开:var=(80+40)*2;,带参数的宏定义,一般形式:#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,带参数的宏定义,例#define POWER(x)x*x x=4;y=6;z=POWER(x+y);宏展开:z=x+y*x+y;一般写成:#define POWER(x)(x)*(x)宏展开:z=(
5、x+y)*(x+y);,带参数的宏定义,读程序写结果#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,带参数的宏定义,读程序写结果#include#define 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.5,宏定义和函数,#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);,例 用宏定义和函数实现同样的功能,带参的宏与函数区别,总结,编译预处理不带参数的宏定义带参数的宏定义,Thank you,Question?,