欢迎来到天天文库
浏览记录
ID:36211218
大小:140.00 KB
页数:16页
时间:2019-05-07
《c语言 编译预处理》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第10章编译预处理编译预处理文件包含宏定义条件编译10.1文件包含1.命令的一般形式格式1:#include<文件名>格式2:#include"文件名"文件包含是将指定的某个源文件的内容全部包含到当前文件中。用include命令实现。格式1:预处理程序仅在C所在目录下查找指定文件格式2:预处理程序首先在当前目录中查找指定文件若找不到再到C所在目录中查找。#define宏名字符串宏定义的功能:在进行编译前,用字符串原样替换程序中的宏名。这个替换过程称为“宏替换”或“宏展开”,字符串也称为替换文本。一般格式:10.2不带参数的宏定义#definePI3.14#defineSPI*r*r#
2、defineV4*S*r/3main(){floatr;printf("Inputr:");scanf("%f",&r);printf("S=%.2fV=%.2f",S,V);}宏定义的作用域是从定义处开始到源文件结束,但根据需要可用undef命令终止其作用域。形式为:#undef宏名#defineYES1main(){printf("%d",YES);max();}#undefYES#defineYES0max(){printf("%d",YES);}定义形式:#define宏名(形参表)字符串功能:用宏名后圆括号中的实参替换字符串中的形参把源程序中所有带参数的宏名用宏定义
3、中的字符串替换10.3带参数的宏定义不能加空格#defineS(a,b)a*b………..area=S(3,2);宏展开:area=3*2;引用形式:宏名(实参表)#defineS(r)PI*r*r相当于定义了不带参宏S,代表字符串“(r)PI*r*r”例:#definePOWER(x)x*xx=4;y=6;z=POWER(x+y);宏展开:z=x+y*x+y;一般写成:#definePOWER(x)((x)*(x))宏展开:z=((x+y)*(x+y));形参用实参换,其它字符保留,宏体及各形参外一般应加括号()练习:#defineMA(x)x*(x-1)main(){inta=1,
4、b=2;printf("%d",MA(1+a+b));}输出结果:8注意:带参数的宏定义与函数是不同的!函数调用是在运行时处理的,先求表达式的值,然后代入临时分配的形参,有类型问题有返回值。函数调用不改变源程序。宏展开则是在预编译时进行的,只将实参字符置换对应的形参,不分配单元,不进行值的传递,没有类型问题,也无返回值的概念。宏展开后源程序发生变化。本质上宏展开仅仅是字符序列的替换,由编译系统对替换后字符序列进行解释和语法检查,只占编译时间。格式1:#ifdef标识符程序段1#else程序段2#endif10.4条件编译若所指定的标识符已经被#define定义,则编译程序段1,否
5、则编译程序段2#include#defineMA1main(){inta=10;#ifdefMAa=a-10;printf("%d",a);#elsea=a+10;printf("%d",a);#endif}输出结果:0010.4条件编译格式2:#ifndef标识符程序段1#else程序段2#endif若所指定的标识符未被#define定义,则编译程序段1,否则编译程序段2#include#defineMA1main(){inta=10;#ifndefMAa=a-10;printf("%d",a);#elsea=a+10;printf(
6、"%d",a);#endif}输出结果:20//#defineMA1输出结果:010.4条件编译格式3:#if常量表达式程序段1#else程序段2#endif若常量表达式非0,则编译程序段1,否则编译程序段2#include#defineLETTER0main(){charstr[20],c;inti=0;gets(str);while(c=str[i]){i++;#ifLETTERif(c>='a'&&c<='z')c=c-32;#elseif(c>='A'&&c<='Z')c=c+32;#endifprintf("%c",c);}}
此文档下载收益归作者所有