写好C语言,漂亮的宏定义很重要,使用宏定义可以防止出错,提高可移植性,可读性,方便性等等。下面列举一些成熟软件中常用的宏定义。
1.防止一个头文件被重复包含
1defineCOMDEF_H3//头文件内容4defineMEM_B(x)(*((byte*)(x)))2defineMAX(x,y)(((x)(y))?(x):(y))2defineFPOS(type,field)\2/*lint-e545*/((dword)((type*)0)-field)/*lint+e545*/
6.得到一个结构体中field所占用的字节数
1defineFLIPW(ray)((((word)(ray)[0])*256)+(ray)[1])
8.按照LSB格式把一个Word转化为两个字节
1defineB_PTR(var)((byte*)(void*)(var))2defineWORD_LO(xxx)((byte)((word)(xxx)255))2defineRND8(x)((((x)+7)/8)*8)
12.将一个字母转换为大写
1defineDECCHK(c)((c)='0'(c)='9')
14.判断字符是不是16进制的数字
1defineINC_SAT(val)(val=((val)+1(val))?(val)+1:(val))
16.返回数组元素的个数
1defineMOD_BY_POWER_OF_TWO(val,mod_by)\2((dword)(val)(dword)((mod_by)-1))
18.对于IO空间映射在存储空间的结构,输入输出处理
1defineinpw(port)(*((volatileword*)(port)))3defineoutp(port,val)(*((volatilebyte*)(port))=((byte)(val)))5defineoutpdw(port,val)(*((volatiledword*)(port))=((dword)(val)))
19.使用一些宏跟踪调试
ANSI标准说明了五个预定义的宏名。它们是:
1_LINE_2_FILE_3_DATE_4_TIME_5_STDC_
如果编译不是标准的,则可能仅支持以上宏名中的几个,或根本不支持。记住编译程序也许还提供其它预定义的宏名。
_LINE_及_FILE_宏指令在有关ifdef_DEBUG2else4if
20.宏定义防止使用时错误用小括号包含。
例如:
1difneDO(a,b)a+b;\2a++;
应用时:
1if(….)2DO(a,b);//产生错误3else
解决方法:
1#difneDO(a,b)do{a+b;\2a++;}while(0)
版权声明:本站所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流,不声明或保证其内容的正确性,如发现本站有涉嫌抄袭侵权/违法违规的内容。请举报,一经查实,本站将立刻删除。