嵌入式Linux下C程序设计--10预处理

嵌入式Linux下C程序设计--10预处理

ID:44439993

大小:1007.00 KB

页数:28页

时间:2019-10-22

嵌入式Linux下C程序设计--10预处理_第1页
嵌入式Linux下C程序设计--10预处理_第2页
嵌入式Linux下C程序设计--10预处理_第3页
嵌入式Linux下C程序设计--10预处理_第4页
嵌入式Linux下C程序设计--10预处理_第5页
资源描述:

《嵌入式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文件包

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。