预处理位操作_第1页
预处理位操作_第2页
预处理位操作_第3页
预处理位操作_第4页
预处理位操作_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

课程主要内容预处理位操作问题与习题第一部分专题主要内容

1.1宏定义1.2条件编译1.3文件包含2.1位操作1.1宏定义(1)宏定义普通宏#definePI(3.1415926)带参数的宏#definemax(a,b)((a)>(b)?(a),(b))取消定义#undef MacroName为什么要用宏定义维护性:有时我们需要将某个特定数据(如某个数据表的大小)在程序中出现的所有实例统统加以修改,我们希望能够只做一个改动就达到目的#defineMAXSIZE100在函数调用的时候会带来重大的系统开销,因此我们有时希望有一个程序块,看上去像一个函数,但却没有函数调用的开销#definemax(a,b)(((a)>=(b))?(a):(b))提高程序的易读性:文字比数字要容易理解多,一个好的宏名可以顾名思义。1.1宏定义(2)宏定义的特点宏定义值使用宏名代替一个字符串,不做语法检查对程序中用双括号括起来的字符串内部的字符,即使与宏名相同,也不进行替换函数调用和宏定义的区别函数调用时,先求出实参表达式的值,然后代入形参。而使用带参数的宏只是进行简单的字符替换对于函数调用,对实参要进行类型检查,如果实参与形参类型不一致,应进行类型转换,如果无法转换,编译时会出错。但是宏定义不会做类型检查宏定义和类型定义的区别宏定义不做语法检查,可以把任何字符串定义成类型#defineAinteger/*integer不是一个合法的类型*/使用宏定义结果有时与预期的不同#defineT1structstudent*Typedefstructstudent*T2;T1a,b;/*相当于structstudent*a,b,b不是结构体指针,与预期的不同*/T2a,b;1.1宏定义(3)使用宏定义需要注意不要忽视宏定义中的空格#definef(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 #endif条件编译指令#ifdef…#else…#endif#ifndef…#else…#endif#if1…#else…#endif#if0…#else…#endif条件编译的应用解决头文件重复包含的问题在调试时,用条件编译的方式将debug语句加入;在修改Bug时候,用条件编译方式引入新的修正,并保留原来的程序;1.3文件包含头文件包含#include“xxxx.h”含义是在编译时将头文件的内容加入到包含文件中。头文件包含的方式#include“xxxx.h”到本级目录去找。#include<xxxx.h>到系统默认目录和本级目录去找。重复包含(重复定义)由于头文件包含可以嵌套,那么C文件就有可能包含多次同一个头文件,就可能出现重复定义的问题的通过条件编译开关来避免重复包含(重复定义)例如#ifndef__headerfileXXX__

#define__headerfileXXX__

…文件内容

…#endif2.1位操作(1)基本位操作符<<,>>如(0x01)<<4=0x10;(0x80)>>4=0x08位操作应用举例乘法、除法,例如a*8可以写成a<<3;地址计算,例如一个32位的地址装在元素类型是char的数组a[4]中(假设按照从低到高存放),那么计算这个地址的方法为((a[3]<<24)|(a[2]<<16)|(a[1]<<8)|a[0]容易出现的问题尽量使用无符号变量,避免产生符号错误;注意避免发生数据溢出;2.1位操作(2)位运算符例子分析请分析下面问题的含义。

#typedefunsignedchar

UINT1

#typedefunsignedshort

UINT2

#typedefunsignedlong

UINT4问题1:

#define

MC_GET_CHAR(__data__)

\ (*((UINT1*)(__data__))) 问题2: #defineMC_GET_SHORT(__data__)\ ((UINT2)((((UINT2)(*((UINT1*)(__data__))))<<8)\ |((UINT2)(*((UINT1*)(__data__)+1)))&0x00ff)))2.1位操作(3) 问题3:

#define

MC_GET_LONG(__data__)

\ ((((UINT4)MC_GET_SHORT((__data__)))<<16)\ |(((UINT4)MC_GET_SHORT(__data__+2))&0x0000ffff)) 问题4:

#defineMC_GET_3BN(__data__)

\ ((((UINT4)MC_GET_CHAR((__data__)))<<16)\ |(((UINT4)MC_GET_SHORT(__data__+1))&

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论