专题-预处理、位操作.ppt

专题-预处理、位操作.ppt

ID:52034839

大小:119.50 KB

页数:16页

时间:2020-03-30

专题-预处理、位操作.ppt_第1页
专题-预处理、位操作.ppt_第2页
专题-预处理、位操作.ppt_第3页
专题-预处理、位操作.ppt_第4页
专题-预处理、位操作.ppt_第5页
资源描述:

《专题-预处理、位操作.ppt》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、专题-预处理、位操作课程主要内容预处理位操作问题与习题第一部分专题主要内容1.1宏定义1.2条件编译1.3文件包含2.1位操作1.1宏定义(1)宏定义普通宏#definePI(3.1415926)带参数的宏#definemax(a,b)((a)>(b)?(a),(b))取消定义#undefMacroName为什么要用宏定义维护性:有时我们需要将某个特定数据(如某个数据表的大小)在程序中出现的所有实例统统加以修改,我们希望能够只做一个改动就达到目的#defineMAXSIZE100在函数调用的时候会带来重大的系统开

2、销,因此我们有时希望有一个程序块,看上去像一个函数,但却没有函数调用的开销#definemax(a,b)(((a)>=(b))?(a):(b))提高程序的易读性:文字比数字要容易理解多,一个好的宏名可以顾名思义。1.1宏定义(2)宏定义的特点宏定义值使用宏名代替一个字符串,不做语法检查对程序中用双括号括起来的字符串内部的字符,即使与宏名相同,也不进行替换函数调用和宏定义的区别函数调用时,先求出实参表达式的值,然后代入形参。而使用带参数的宏只是进行简单的字符替换对于函数调用,对实参要进行类型检查,如果实参与形参类型

3、不一致,应进行类型转换,如果无法转换,编译时会出错。但是宏定义不会做类型检查宏定义和类型定义的区别宏定义不做语法检查,可以把任何字符串定义成类型#defineAinteger/*integer不是一个合法的类型*/使用宏定义结果有时与预期的不同#defineT1structstudent*Typedefstructstudent*T2;T1a,b;/*相当于structstudent*a,b,b不是结构体指针,与预期的不同*/T2a,b;1.1宏定义(3)使用宏定义需要注意不要忽视宏定义中的空格#definef(

4、x)(x)+1//实际上是把f定义成了(x)(x)+1对于不带参数的宏,若宏值多于一项,一定要使用括号#defineMAX(M+N)要给每个参数加上括号,否则可能会影响计算的优先级#defineabs(x)(x>=0)?x:-xz=abs(a+b);/*相当于z=(a+b>=0)?a+b:-a+b//修改后#defineabs(x)((x)>=0?(x):-(x)尽量用typedef而不是宏定义去定义类型1.2条件编译条件编译例子#ifdefBMW#defineSIZE16#else#defineSIZE32#e

5、ndif条件编译指令#ifdef…#else…#endif#ifndef…#else…#endif#if1…#else…#endif#if0…#else…#endif条件编译的应用解决头文件重复包含的问题在调试时,用条件编译的方式将debug语句加入;在修改Bug时候,用条件编译方式引入新的修正,并保留原来的程序;1.3文件包含头文件包含#include“xxxx.h”含义是在编译时将头文件的内容加入到包含文件中。头文件包含的方式#include“xxxx.h”到本级目录去找。#include到系

6、统默认目录和本级目录去找。重复包含(重复定义)由于头文件包含可以嵌套,那么C文件就有可能包含多次同一个头文件,就可能出现重复定义的问题的通过条件编译开关来避免重复包含(重复定义)例如#ifndef__headerfileXXX__#define__headerfileXXX__…文件内容…#endif2.1位操作(1)基本位操作符<<,>>如(0x01)<<4=0x10;(0x80)>>4=0x08位操作应用举例乘法、除法,例如a*8可以写成a<<3;地址计算,例如一个32位的地址装在元素类型是char的数组a[

7、4]中(假设按照从低到高存放),那么计算这个地址的方法为((a[3]<<24)

8、(a[2]<<16)

9、(a[1]<<8)

10、a[0]容易出现的问题尽量使用无符号变量,避免产生符号错误;注意避免发生数据溢出;2.1位操作(2)位运算符例子分析请分析下面问题的含义。#typedefunsignedchar UINT1 #typedefunsignedshort UINT2 #typedefunsignedlong UINT4问题1:#defineMC_GET_CHAR(__data__) (*((UINT1*)(__

11、data__)))问题2:#defineMC_GET_SHORT(__data__)((UINT2)((((UINT2)(*((UINT1*)(__data__))))<<8)

12、((UINT2)(*((UINT1*)(__data__)+1)))&0x00ff)))2.1位操作(3)问题3:#defineMC_GET_LONG(__data__)  ((((UINT

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

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

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