C语言常用宏定义技巧.doc

C语言常用宏定义技巧.doc

ID:56016013

大小:47.95 KB

页数:3页

时间:2020-03-15

C语言常用宏定义技巧.doc_第1页
C语言常用宏定义技巧.doc_第2页
C语言常用宏定义技巧.doc_第3页
资源描述:

《C语言常用宏定义技巧.doc》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、C语言常用宏定义技巧!初学者AVR系列单片机用C语言编程,宏定义是个很重要的编程技巧。用好了宏定义,它可以增强程序的可读性、可移植性、方便性、灵活性等等。1.防止一个头文件被重复包含:#ifndefCOMDEF_H#defineCOMDEF_H//头文件内容endif当你所建的工程有多个源文件组成时,很可能会在多个文件里头包含了同一个头文件,如果借用上面的宏定义就能够避免同一个头文件被重复包含时进行多次编译。因为当它编译第一个头文件时总是没有定义#defineCOMDEF_H,那么它将编译一遍头文件中所有

2、的内容,包括定义#defineCOMDEF_H。这样编译再往下进行时如果遇到同样要编译的头文件,那么由于语句#ifndefCOMDEF_H的存在它将不再重复的编译这个头文件。2.通过宏定义使得同一数据类型的字节数不因不同的平台或不同的编译器而改变:typedefunsignedcharboolean;/*Booleanvaluetype*/typedefunsignedlongintuint32;/*Unsigned32bitvalue*/typedefunsignedshortuint16;/*Unsi

3、gned16bitvalue*/typedefunsignedcharuint8;/*Unsigned8bitvalue*/typedefsignedlongintint32;/*Signed32bitvalue*/typedefsignedshortint16;/*Signed16bitvalue*/typedefsignedcharint8;/*Signed8bitvalue*/3.得到指定地址的一个字节或字:#defineMEM_B(x)(*((uint8*)(x)))#defineMEM_W(x)

4、(*((uint16*)(x)))注:类似于这种有多个字符串组成的宏定义一定要注意加上“()”,因为我们知道宏定义只是一种简单的字符替换功能。4.求最大值和最小值:#defineMAX(x,y)(((x)>(y))?(x):(y))#defineMAX(x,y)(((x)<(y))?(x):(y))5.得到一个结构体中field所占用的字节数:#defineFSIZ(type,field)sizeof(((type*)0)->field)6.按照LSB格式把两个字节转化为一个Word:1#defineFL

5、IPW(ray)((((word)(ray)[0])*256)+(ray)[1])或可以是#defineFLIPW(data1,data2)((((word)(data1))*256)+(data2))7.按照LSB格式把一个Word转化为两个字节:#defineFLOPW(ray,val)do{(ray)[0]=((val)/256);(ray)[1]=((val)&0xFF);}while(0)或可以是#defineFLOPW(data1,data2,val)do{data1=((val)/256);

6、data2=((val)&0xFF);}while(0)注:这里的do{}while(0)是为了防止多语句的宏定义在使用中出错。比如:if(…)FLOPW(ray,val)else上面的程序代码中要是宏定义FLOPW(ray,val)中没有do{}while(0),这时我们应该将语句改为:if(…){FLOPW(ray,val)}else{}8.得到一个变量的地址:#defineB_PTR(var)((byte*)(void*)&(var))#defineW_PTR(var)((word*)(void*)

7、&(var))注:宏定义语句中void*申明了该地址可以是任何类型变量的地址,byte*申明为单字节变量的地址,word*申明为双字节变量的地址。9.得到一个高位和低位字节:#defineWORD_LO(xxx)((byte)((word)(xxx)&0xFF))#defineWORD_HI(xxx)((byte)((word)(xxx)>>8))10.返回一个比X大的最接近的8的倍数:#defineRND8(x)((((x)+7)/8)*8)11.将一个字母转换为大写:#defineUPCASE(c)(

8、((c)>=‘a’&&(c)<=‘z’)?((c)–0x20):(c))相对应的还有将一个字母转换为小写:#defineUPCASE(c)(((c)>=‘A’&&(c)<=‘Z’)?((c)+0x20):(c))注:如果你记不住大写和小写之间的ASCII差值,可以将0x20换成(’a’-‘A’),但这里小写的ASCII值大于大写的ASCII值你该要记住的吧。12.防止溢出的一个方法:#defineINC_SAT(val)(va

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

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

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