写好C语言,漂亮的宏定义很重要,使用宏定义可以防止出错,提高可移植性,可读性,方便性
1,防止一个头文件被重复包含#ifndef COMDEF_H
#define COMDEF_H
//头文件内容
#endif
2,重新定义一些类型,防止由于各种平台和编译器的不同,而产生的类型字节数差异,方便移植。
typedefunsigned char boolean; /* Boolean value type. */
typedefunsigned long intuint32; /* Unsigned 32 bit value */
typedefunsigned short uint16; /* Unsigned 16 bit value */
typedefunsigned char uint8; /* Unsigned 8bit value */
typedefsigned long int int32; /* Signed 32 bit value */
typedefsigned short int16; /* Signed 16 bit value */
typedefsigned char int8; /* Signed 8bit value */
//下面的不建议使用
typedefunsigned char byte; /* Unsigned 8bit value type. */
typedefunsigned short word; /* Unsinged 16 bit value type. */
typedefunsigned long dword; /* Unsigned 32 bit value type. */
typedefunsigned char uint1; /* Unsigned 8bit value type. */
typedefunsigned short uint2; /* Unsigned 16 bit value type. */
typedefunsigned long uint4; /* Unsigned 32 bit value type. */
typedefsigned char int1; /* Signed 8bit value type. */
typedefsigned short int2; /* Signed 16 bit value type. */
typedeflong int int4; /* Signed 32 bit value type. */
typedefsigned long sint31; /* Signed 32 bit value */
typedefsigned short sint15; /* Signed 16 bit value */
typedefsigned char sint7; /* Signed 8bit value */
3,得到指定地址上的一个字节或字
#defineMEM_B( x )( *( (byte *) (x) ) )
#defineMEM_W( x )( *( (word *) (x) ) )
4,求最大值和最小值
#defineMAX( x, y ) ( ((x) > (y)) ? (x) : (y) )
#defineMIN( x, y ) ( ((x) < (y)) ? (x) : (y) )
5,得到一个field在结构体(struct)中的偏移量
#define FPOS( type, field ) \
/*lint -e545 */ ( (dword) &(( type *) 0)-> field ) /*lint +e545 */
6,得到一个结构体中field所占用的字节数
#define FSIZ( type, field ) sizeof( ((type *) 0)->field )
7,按照LSB格式把两个字节转化为一个Word
#defineFLIPW( ray ) ( (((word) (ray)) * 256) + (ray) )
8,按照LSB格式把一个Word转化为两个字节
#defineFLOPW( ray, val ) \
(ray) = ((val) / 256); \
(ray) = ((val) & 0xFF)
9,得到一个变量的地址(word宽度)
#defineB_PTR( var )( (byte *) (void *) &(var) )
#defineW_PTR( var )( (word *) (void *) &(var) )
10,得到一个字的高位和低位字节
#defineWORD_LO(xxx)((byte) ((word)(xxx) & 255))
#defineWORD_HI(xxx)((byte) ((word)(xxx) >> 8))
11,返回一个比X大的最接近的8的倍数
#define RND8( x ) ((((x) + 7) / 8 ) * 8 )
12,将一个字母转换为大写
#defineUPCASE( c ) ( ((c) >= 'a' && (c) <= 'z') ? ((c) - 0x20) : (c) )
13,判断字符是不是10进值的数字
#defineDECCHK( c ) ((c) >= '0' && (c) <= '9')
14,判断字符是不是16进值的数字
#defineHEXCHK( c ) ( ((c) >= '0' && (c) <= '9') ||\
((c) >= 'A' && (c) <= 'F') ||\
((c) >= 'a' && (c) <= 'f') )
15,防止溢出的一个方法
#defineINC_SAT( val )(val = ((val)+1 > (val)) ? (val)+1 : (val))
16,返回数组元素的个数
#defineARR_SIZE( a )( sizeof( (a) ) / sizeof( (a) ) )
17,返回一个无符号数n尾的值MOD_BY_POWER_OF_TWO(X,n)=X%(2^n)
#define MOD_BY_POWER_OF_TWO( val, mod_by ) \
( (dword)(val) & (dword)((mod_by)-1) )
18,对于IO空间映射在存储空间的结构,输入输出处理
#define inp(port) (*((volatile byte *) (port)))
#define inpw(port) (*((volatile word *) (port)))
#define inpdw(port) (*((volatile dword *)(port)))
#define outp(port, val) (*((volatile byte *) (port)) = ((byte) (val)))
#define outpw(port, val)(*((volatile word *) (port)) = ((word) (val)))
#define outpdw(port, val) (*((volatile dword *) (port)) = ((dword) (val)))
19,使用一些宏跟踪调试
A N S I标准说明了五个预定义的宏名。它们是:
_ L I N E _
_ F I L E _
_ D A T E _
_ T I M E _
_ S T D C _
如果编译不是标准的,则可能仅支持以上宏名中的几个,或根本不支持。记住编译程序
也许还提供其它预定义的宏名。
_ L I N E _及_ F I L E _宏指令在有关# l i n e的部分中已讨论,这里讨论其余的宏名。
_ D AT E _宏指令含有形式为月/日/年的串,表示源文件被翻译到代码时的日期。
源代码翻译到目标代码的时间作为串包含在_ T I M E _中。串形式为时:分:秒。
如果实现是标准的,则宏_ S T D C _含有十进制常量1。如果它含有任何其它数,则实现是
非标准的。
可以定义宏,例如:
当定义了_DEBUG,输出数据信息和所在文件所在行
#ifdef _DEBUG
#define DEBUGMSG(msg,date) printf(msg);printf(“%d%d%d”,date,_LINE_,_FILE_)
#else
#define DEBUGMSG(msg,date)
#endif
20,宏定义防止使用是错误
用小括号包含。
例如:#define ADD(a,b) (a+b)
用do{}while(0)语句包含多语句防止错误
例如:#difne DO(a,b) a+b;\
a++;
应用时:if(….)
DO(a,b); //产生错误
else
解决方法: #difne DO(a,b) do{a+b;\
a++;}while(0) 不错不错 记号 mark 不错的东东 mark 宏定义 good好东西啊 看看 马渴! mark mark mark mark 这个很好。 MARK 马克 上面有一些东西还没有用过呢 MARK 大部分使用了,部分没有使用过。 这个很好。 mark mark mark mark 好东西。MARK 写的不错 写的不错 mark mark 学习了! mark mark 有价值。 有价值 可以顶一顶 MARK MARK 马赛克 还不错!! MARK 学习! MARK!! mark mark 这个总结的太好了! 留用 好好好 mark mark mark 不错!做个记号 mark 学习了,还没用过 LZ辛苦了 学习了,有一些还看不懂 学习一次 写的不错 mark mark mark mark 好贴,学习了! 学习宏定义 mark 回复【楼主位】2006612
-----------------------------------------------------------------------
mark 不错的东东,部分没用过 不错写的!!! 总结得不错 记号记号... 谢谢,支持。 个人认为不好说,想起linux kernel的宏我真的很无奈。
山不转的时候水也转。 很好,学习了,谢谢楼主。 本帖最后由 xiaosi1102 于 2012-3-28 23:32 编辑
手机回复重复了 好东西,必须顶! 不错,收藏! 不错的东西{:biggrin:} mark.. 这个有用。 收下了哈 不错,仔细看看。 MARK,MARK,MARK, 楼主你太好了.........
static/image/common/sigline.gif
办真实毕业证http://www.hcjy-edu.com mark 现在还mark?直接收藏了~不过这个宏我一直写不好,所以学习了~ mark!!!!!!!!!!!!!!! 来学习。。。。 有价值 {:smile:} 不错 不错,学到很多东西了,谢谢共享 不错啊 收了看看 不错。。。。mark。。。。 学习来了,谢谢共享。 好,不错! 还不会使用,学习一下 确实不错 mark 挺不错mark之 记一下!!! 标记下
来自:amoBBS 阿莫电子论坛 Windows Phone 7 客户端