资源描述:
《嵌入式Linux下C程序设计--10预处理》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、嵌入式Linux下C程序设计主讲:成宝宗编译预处理主讲:成宝宗主要内容宏的定义文件包含条件编译程序综合举例“预处理”是指在对C语言源程序进行编译之前,要先对程序中的“宏定义、文件包含、条件编译”等特殊命令进行预先处理。宏定义:定义一个标识符来表示一个字符串,称为“宏定义”,该标识符称为“宏名”。在编译预处理时,对程序中所有出现的“宏名”的地方都用字符串去代换。宏定义分类:分为有参数宏定义和无参数宏定义两种。宏的定义不带参数的宏定义宏定义的一般格式为:#define<标识符>文本串/*#define就是宏定义命令*/功能:将宏名的值定义为指定的文本串。在预处理
2、时凡出现宏名的地方,都用指定的文本串替换。在预处理时将宏名替换成指定的文本串的过程称为“宏展开”,或称为“宏替换”。【例】求圆周长、面积和相同半径圆球体积。#definePI3.14159voidmain(){floatr,l,s,v;printf(“inputradius:”);scanf(“%f”,&r);l=2.0*PI*r;s=PI*r*r;v=3.0/4*PI*r*r*r;printf(“l=%6.2f\ns=%6.2f\nv=%6.2f\n”,l,s,v);}程序运行结果:inputradius:6l=37.70s=113.10v=508.94注
3、意:(1)宏名为了与变量名区别一般用大写字母表示。(2)宏展开时只用文本串替换宏名,不作正确性检查。(3)宏定义行末尾不能加分号。加分号,宏展时会当作文本串字符一同代入。(4)宏名的有效范围是:从定义位置开始到本文件结束(5)可以用#undef命令终止宏定义的作用域。(6)在宏定义时,可以引用已定义的宏名。【例】在宏定义时引用已定义的宏名#defineR4.0#definePI3.14159#defineL2*PI*R#defineSPI*R*Rvoidmain(){printf(“L=%6.2fS=%6.2f”,L,S);}运行结果如下:L=25.
4、13S=50.27【例】分析下列程序#defineOK100voidmain(){printf("OK");printf("");}运行结果为:OK为什么不是100?带参数的宏定义带参数的宏定义格式如下:#define<宏名>(参数表)文本串功能:定义一个带参数的宏。例如:#defineS(x,y)3*x+2*yarea=S(3,2);宏展开:用实参从左到右逐个字符进行替换文本串中的形参字符。如图8.1所示。执行:area=S(3,2)宏展开后变成:area=3*3+2*2;【例】求圆的面积。#definePI3.14159#defineS(r)PI*r
5、*rvoidmain(){floata,area;a=3.6;area=S(a);printf(“area=%6.2f\n”,area);}运行结果:area=40.72说明:(1)宏名与括弧之间不能有空格。(2)宏调用时,实参的个数必须与形参的个数相同。(3)带参数的宏替换时不作语法检查。(4)宏定义时最好在参数两侧加括号和整个字符串外加括号,防止宏替换出错。【例】分析以下程序运行结果#defineSQ(y)((y)*(y))voidmain(){inta,sq;printf("inputanumber:");scanf("%d",&a);sq=160/S
6、Q(a+1);printf("sq=%d",sq);}比较下面【例6】和【例7】程序的不同之处。【例6】#defineSQ(y)y*yvoidmain(){inta,sq;printf("inputanumber:");scanf("%d",&a);sq=SQ(a+1);printf("sq=%d",sq);}运行结果为:inputanumber:3↙sq=7/*宏代换后得到:sq=a+1*a+1;*/【例7】#defineSQ(y)(y)*(y)voidmain(){inta,sq;printf("inputanumber:");scanf("%d
7、",&a);sq=SQ(a+1);printf("sq=%d",sq);}运行结果为:inputanumber:3↙sq=16/*宏代换后得到:sq=(a+1)*(a+1);*/宏调用和函数调用的主要区别:带参宏函数处理过程不分配内存简单的字符置换分配内存先求实参值,再代入形参处理时间编译时程序运行时参数类型无类型问题定义实参,形参类型程序长度变长不变运行速度不占运行时间调用和返回占时间文件包含:就是将指定文件全部内容包含(装入)到本文件中来。一般格式:#include“文件名”或#include<文件名>功能:将指定的源文件全部内容包含进来,即装入#i
8、nclude命令所处位置上使其成为一个程序。2文件包