搜索
bottom↓
回复: 281

写好C语言,漂亮的宏定义很重要,使用宏定义可以防止出错,提高可移植性,可读性,方便性

  [复制链接]

出0入0汤圆

发表于 2011-8-2 21:45:10 | 显示全部楼层 |阅读模式
1,防止一个头文件被重复包含

#ifndef COMDEF_H

#define COMDEF_H

  //头文件内容

#endif

2,重新定义一些类型,防止由于各种平台和编译器的不同,而产生的类型字节数差异,方便移植。

typedef  unsigned char      boolean;     /* Boolean value type. */
typedef  unsigned long int  uint32;      /* Unsigned 32 bit value */
typedef  unsigned short     uint16;      /* Unsigned 16 bit value */
typedef  unsigned char      uint8;       /* Unsigned 8  bit value */
typedef  signed long int    int32;       /* Signed 32 bit value */
typedef  signed short       int16;       /* Signed 16 bit value */
typedef  signed char        int8;        /* Signed 8  bit value */

//下面的不建议使用

typedef  unsigned char     byte;         /* Unsigned 8  bit value type. */
typedef  unsigned short    word;         /* Unsinged 16 bit value type. */
typedef  unsigned long     dword;        /* Unsigned 32 bit value type. */
typedef  unsigned char     uint1;        /* Unsigned 8  bit value type. */
typedef  unsigned short    uint2;        /* Unsigned 16 bit value type. */
typedef  unsigned long     uint4;        /* Unsigned 32 bit value type. */
typedef  signed char       int1;         /* Signed 8  bit value type. */
typedef  signed short      int2;         /* Signed 16 bit value type. */
typedef  long int          int4;         /* Signed 32 bit value type. */
typedef  signed long       sint31;       /* Signed 32 bit value */
typedef  signed short      sint15;       /* Signed 16 bit value */
typedef  signed char       sint7;        /* Signed 8  bit value */

  

3,得到指定地址上的一个字节或字

#define  MEM_B( x )  ( *( (byte *) (x) ) )
#define  MEM_W( x )  ( *( (word *) (x) ) )

4,求最大值和最小值

   #define  MAX( x, y ) ( ((x) > (y)) ? (x) : (y) )

   #define  MIN( 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

#define  FLIPW( ray ) ( (((word) (ray)[0]) * 256) + (ray)[1] )

8,按照LSB格式把一个Word转化为两个字节

#define  FLOPW( ray, val ) \

  (ray)[0] = ((val) / 256); \

  (ray)[1] = ((val) & 0xFF)

9,得到一个变量的地址(word宽度)

#define  B_PTR( var )  ( (byte *) (void *) &(var) )

#define  W_PTR( var )  ( (word *) (void *) &(var) )

10,得到一个字的高位和低位字节

#define  WORD_LO(xxx)  ((byte) ((word)(xxx) & 255))

#define  WORD_HI(xxx)  ((byte) ((word)(xxx) >> 8))

11,返回一个比X大的最接近的8的倍数

#define RND8( x )       ((((x) + 7) / 8 ) * 8 )

12,将一个字母转换为大写

#define  UPCASE( c ) ( ((c) >= 'a' && (c) <= 'z') ? ((c) - 0x20) : (c) )

13,判断字符是不是10进值的数字

#define  DECCHK( c ) ((c) >= '0' && (c) <= '9')

14,判断字符是不是16进值的数字

#define  HEXCHK( c ) ( ((c) >= '0' && (c) <= '9') ||\

                       ((c) >= 'A' && (c) <= 'F') ||\

((c) >= 'a' && (c) <= 'f') )

15,防止溢出的一个方法

#define  INC_SAT( val )  (val = ((val)+1 > (val)) ? (val)+1 : (val))

16,返回数组元素的个数

#define  ARR_SIZE( a )  ( sizeof( (a) ) / sizeof( (a[0]) ) )

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)))

[2005-9-9添加]  

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)

阿莫论坛20周年了!感谢大家的支持与爱护!!

如果想吃一顿饺子,就得从冰箱里取出肉,剁馅儿,倒面粉、揉面、醒面,擀成皮儿,下锅……
一整个繁琐流程,就是为了出锅时那一嘴滚烫流油的热饺子。

如果这个过程,禁不住饿,零食下肚了,饺子出锅时也就不香了……《非诚勿扰3》

出0入0汤圆

 楼主| 发表于 2011-8-3 18:46:12 | 显示全部楼层
不错不错

出0入0汤圆

发表于 2012-2-29 06:04:32 | 显示全部楼层
记号

出0入0汤圆

发表于 2012-2-29 08:02:49 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-2-29 08:14:54 | 显示全部楼层
不错的东东

出0入0汤圆

发表于 2012-2-29 08:21:03 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-2-29 08:23:02 | 显示全部楼层
宏定义

出0入0汤圆

发表于 2012-2-29 08:26:41 | 显示全部楼层
good  好东西啊

出0入0汤圆

发表于 2012-2-29 08:27:28 | 显示全部楼层
看看

出90入372汤圆

发表于 2012-2-29 08:49:22 | 显示全部楼层
马渴!

出0入0汤圆

发表于 2012-2-29 09:14:40 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-2-29 09:15:08 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-2-29 10:24:51 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-2-29 10:28:05 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-2-29 10:28:42 | 显示全部楼层
这个很好。

出0入0汤圆

发表于 2012-2-29 10:28:43 | 显示全部楼层
MARK

出0入0汤圆

发表于 2012-2-29 10:29:34 | 显示全部楼层
马克

出0入0汤圆

发表于 2012-2-29 11:27:37 | 显示全部楼层
上面有一些东西还没有用过呢

出0入0汤圆

发表于 2012-2-29 11:35:23 | 显示全部楼层
MARK

出0入0汤圆

发表于 2012-2-29 11:46:58 | 显示全部楼层
大部分使用了,部分没有使用过。

出0入0汤圆

发表于 2012-2-29 13:07:39 | 显示全部楼层
这个很好。

出0入0汤圆

发表于 2012-2-29 13:23:03 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-2-29 13:27:15 | 显示全部楼层
mark

出0入8汤圆

发表于 2012-2-29 13:56:56 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-2-29 14:37:11 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-2-29 20:17:27 | 显示全部楼层
好东西。MARK

出0入0汤圆

发表于 2012-2-29 21:07:52 | 显示全部楼层
写的不错

出0入0汤圆

发表于 2012-2-29 21:29:17 | 显示全部楼层
写的不错

出0入0汤圆

发表于 2012-2-29 22:14:29 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-2-29 22:32:29 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-2-29 23:02:13 | 显示全部楼层
学习了!

出0入0汤圆

发表于 2012-2-29 23:06:47 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-2-29 23:09:41 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-2-29 23:19:00 | 显示全部楼层
有价值。

出0入0汤圆

发表于 2012-3-1 09:04:48 | 显示全部楼层
有价值

出0入0汤圆

发表于 2012-3-1 10:06:21 | 显示全部楼层
可以顶一顶

出0入0汤圆

发表于 2012-3-1 10:56:57 | 显示全部楼层
MARK

出0入4汤圆

发表于 2012-3-1 12:52:03 | 显示全部楼层
MARK

出0入0汤圆

发表于 2012-3-1 12:56:28 | 显示全部楼层
马赛克

出0入0汤圆

发表于 2012-3-1 13:20:12 | 显示全部楼层
还不错!!

出0入0汤圆

发表于 2012-3-1 13:46:54 | 显示全部楼层
MARK

出0入0汤圆

发表于 2012-3-1 13:50:37 | 显示全部楼层
学习!

出0入0汤圆

发表于 2012-3-1 14:00:18 | 显示全部楼层
MARK!!

出0入0汤圆

发表于 2012-3-1 14:01:44 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-3-1 14:13:01 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-3-1 14:25:09 | 显示全部楼层
这个总结的太好了!

出5入190汤圆

发表于 2012-3-1 14:40:46 | 显示全部楼层
留用

出0入0汤圆

发表于 2012-3-1 14:50:40 | 显示全部楼层
好好好

出0入4汤圆

发表于 2012-3-1 16:50:22 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-3-1 17:43:52 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-3-1 17:59:53 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-3-1 20:04:30 | 显示全部楼层
不错!做个记号

出0入0汤圆

发表于 2012-3-1 20:46:01 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-3-1 23:02:13 | 显示全部楼层
学习了,还没用过

出0入0汤圆

发表于 2012-3-2 13:50:10 | 显示全部楼层
LZ辛苦了

出0入0汤圆

发表于 2012-3-2 14:55:59 | 显示全部楼层
学习了,有一些还看不懂

出0入0汤圆

发表于 2012-3-3 20:05:06 | 显示全部楼层
学习一次

出0入0汤圆

发表于 2012-3-3 21:28:50 | 显示全部楼层
写的不错

出0入0汤圆

发表于 2012-3-3 22:31:32 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-3-4 01:39:25 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-3-4 08:48:19 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-3-4 09:00:27 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-3-4 09:39:09 | 显示全部楼层
好贴,学习了!

出0入0汤圆

发表于 2012-3-4 09:43:41 | 显示全部楼层
学习宏定义

出0入0汤圆

发表于 2012-3-4 17:10:13 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-3-7 13:35:49 | 显示全部楼层
回复【楼主位】2006612  
-----------------------------------------------------------------------

mark

出0入0汤圆

发表于 2012-3-27 15:10:57 | 显示全部楼层
不错的东东,部分没用过

出0入0汤圆

发表于 2012-3-27 15:39:08 | 显示全部楼层
不错写的!!!

出0入0汤圆

发表于 2012-3-27 15:42:46 | 显示全部楼层
总结得不错

出0入0汤圆

发表于 2012-3-27 22:22:42 | 显示全部楼层
记号记号...

出0入0汤圆

发表于 2012-3-27 22:37:56 | 显示全部楼层
谢谢,支持。

出0入0汤圆

发表于 2012-3-27 22:53:12 | 显示全部楼层
个人认为不好说,想起linux kernel的宏我真的很无奈。
山不转的时候水也转。

出0入0汤圆

发表于 2012-3-27 23:31:23 来自手机 | 显示全部楼层
很好,学习了,谢谢楼主。

出0入0汤圆

发表于 2012-3-27 23:37:57 来自手机 | 显示全部楼层
本帖最后由 xiaosi1102 于 2012-3-28 23:32 编辑

手机回复重复了

出0入0汤圆

发表于 2012-3-27 23:40:43 来自手机 | 显示全部楼层
好东西,必须顶!

出0入0汤圆

发表于 2012-3-28 00:00:01 | 显示全部楼层
不错,收藏!

出0入0汤圆

发表于 2012-3-28 00:16:34 | 显示全部楼层
不错的东西

出0入0汤圆

发表于 2012-3-28 08:50:05 | 显示全部楼层
mark..                  

出0入0汤圆

发表于 2012-3-28 09:35:03 | 显示全部楼层
这个有用。

出0入0汤圆

发表于 2012-3-28 09:43:19 | 显示全部楼层
收下了哈

出0入0汤圆

发表于 2012-3-28 11:07:57 | 显示全部楼层
不错,仔细看看。      

出0入0汤圆

发表于 2012-3-28 11:16:17 | 显示全部楼层
MARK,MARK,MARK,

出0入0汤圆

发表于 2012-3-28 11:20:28 | 显示全部楼层
楼主你太好了.........












办真实毕业证http://www.hcjy-edu.com

出0入0汤圆

发表于 2012-3-28 11:22:46 | 显示全部楼层
mark              

出0入0汤圆

发表于 2012-3-28 13:52:10 | 显示全部楼层
现在还mark?直接收藏了~不过这个宏我一直写不好,所以学习了~

出0入0汤圆

发表于 2012-3-28 14:23:44 | 显示全部楼层
mark!!!!!!!!!!!!!!!

出0入0汤圆

发表于 2012-3-28 14:26:43 | 显示全部楼层
来学习。。。。

出0入0汤圆

发表于 2012-3-28 14:30:02 | 显示全部楼层
有价值                  

出0入0汤圆

发表于 2012-3-28 14:36:52 | 显示全部楼层
不错

出0入0汤圆

发表于 2012-6-24 22:33:44 | 显示全部楼层
不错,学到很多东西了,谢谢共享

出0入0汤圆

发表于 2012-6-25 12:08:09 | 显示全部楼层
不错啊   收了看看

出0入0汤圆

发表于 2012-6-25 12:56:21 | 显示全部楼层
不错。。。。mark。。。。

出0入0汤圆

发表于 2012-8-29 21:16:36 | 显示全部楼层
学习来了,谢谢共享。

出0入0汤圆

发表于 2012-8-29 21:56:11 | 显示全部楼层
好,不错!

出0入0汤圆

发表于 2013-1-27 22:59:21 来自手机 | 显示全部楼层
还不会使用,学习一下

出0入0汤圆

发表于 2013-1-27 23:40:41 来自手机 | 显示全部楼层
确实不错

出0入0汤圆

发表于 2013-1-31 14:27:50 | 显示全部楼层
mark      

出0入0汤圆

发表于 2013-2-1 11:19:13 | 显示全部楼层
挺不错  mark之

出0入0汤圆

发表于 2013-2-1 11:26:33 | 显示全部楼层
记一下!!!

出0入0汤圆

发表于 2013-2-1 16:18:08 来自手机 | 显示全部楼层
标记下
来自:amoBBS 阿莫电子论坛 Windows Phone 7 客户端
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-28 18:43

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表