使用宏定义可以防止出错,提高可移植性,可读性,方便性等。
下面列举了一些成熟软件中常用的宏定义。
重新定义一些类型,防止由于各种平台和编译器的不同,而产生的类型字节数差异,方便移植:
typedefunsignedcharboolean;/*Booleanvaluetype.*/ typedefunsignedlongintuint32;/*Unsigned32bitvalue*/ typedefunsignedshortuint16;/*Unsigned16bitvalue*/ typedefunsignedcharuint8;/*Unsigned8bitvalue*/ typedefsignedlongintint32;/*Signed32bitvalue*/ typedefsignedshortint16;/*Signed16bitvalue*/ typedefsignedcharint8;/*Signed8bitvalue*/
求最大值和最小值:
#defineMAX(x,y)(((x)>(y))?(x):(y)) #defineMIN(x,y)(((x)< (y)) ? (x) : (y) )
得到一个field在结构体(struct)中的偏移量:
#defineFPOS(type,field) /*lint-e545*/((dword)&((type*)0)->field)/*lint+e545*/
得到一个结构体中field所占用的字节数:
#defineFSIZ(type,field)sizeof(((type*)0)->field)
按照LSB格式把两个字节转化为一个Word:
1#defineFLIPW(ray)((((word)(ray)[0])*256)+(ray)[1])
按照LSB格式把一个Word转化为两个字节:
#defineFLOPW(ray,val) (ray)[0]=((val)/256); (ray)[1]=((val)&0xFF)
得到一个变量的地址(word宽度):
#defineB_PTR(var)((byte*)(void*)&(var)) #defineW_PTR(var)((word*)(void*)&(var))
得到一个字的高位和低位字节:
#defineWORD_LO(xxx)((byte)((word)(xxx)&255)) #defineWORD_HI(xxx)((byte)((word)(xxx)>>8))
将一个字母转换为大写:
#defineUPCASE(c)(((c)>='a'&&(c)<= 'z') ? ((c) - 0x20) : (c) )
判断字符是不是10进制的数字:
#define DECCHK( c ) ((c) >= '0' && (c) <= '9')
判断字符是不是16进制的数字:
#defineHEXCHK(c)(((c)>='0'&&(c)<= '9') || ((c) >='A'&&(c)<= 'F') || ((c) >='a'&&(c)<= 'f') )
防止一个头文件被重复包含:
#ifndefCOMDEF_H #defineCOMDEF_H //头文件内容 #endif
防止溢出的一个方法:
#defineINC_SAT(val)(val=((val)+1>(val))?(val)+1:(val))
返回数组元素的个数:
#defineARR_SIZE(a)(sizeof((a))/sizeof((a[0])))
审核编辑:刘清
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
存储器
+关注
关注
38文章
7148浏览量
161986 -
C语言
+关注
关注
180文章
7530浏览量
128708 -
LSB算法
+关注
关注
0文章
7浏览量
5778
原文标题:写好C语言,漂亮的宏定义很重要!
文章出处:【微信号:c-stm32,微信公众号:STM32嵌入式开发】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
请问能否麻烦列举一些比较常用的可做滤波电路的芯片?
TI的工程师们能否麻烦你们列举一些比较常用的可做滤波电路的芯片。之前用FilterPro软件设计出来的电路效果挺不错的,但在芯片的选择上就一
发表于 03-07 13:13
【通信专栏】附录一:STM32单片机C语言基础/逻辑运算/按位运算/结构体/宏定义 精选资料分享
在单片机开发中,总有一些C语言基础知识是常常用到的而我们又不易掌握的,今天以STM32单片机为例,总结一
发表于 07-21 08:28
介绍一下C语言的预处理知识与宏定义原理
系统平台上的gcc)前言本篇文章将会向大家介绍一下C语言的预处理知识、宏定义、函数、以及编译执行程序所需的静态链接库和动态链接库的
发表于 02-11 06:35
C语言宏定义使用do{}while(0)的好处是什么
do{}while(0)这种用法呢?主要有两点原因,一个是代码适应性以及拓展性,第二个是为了尽量避免一些不必要的语法和逻辑错误。比如保证你宏定义的函数能够在形如if...else的语句
发表于 02-25 06:28
评论