宏的使用方法

---=====宏的使用方法=====---

  <原创>需转载请加上标题.

    作者:吴金勇

 

最近做项目需要记录许多用户选择.例如记录用户选择的星期.

 

choice.bmp

用笨方法的话,就用结构吧.

例如

typedef struct tagID

{

  BOOL week_1;

  BOOL week_2;

  BOOL week_3;

  BOOL week_4;

  BOOL week_5;

  BOOL week_6;

  BOOL week_7;

}

 

这样可以判断一下每个复选框,然后写入结构中.但如果按每一个BOOL 类型占一个字节算的话,该结构占7个字节,如果需要这样的结构在一千个以上,或者会更多,目前我用它来为每一个文件做上这样一个选择标志,那么在大量的存储情况下,将会浪费很多的存储容量.有没有更好的办法?

答案是肯定的.使用宏吧.

我们使用 WORD 类型来代替该结构,好处是什么呢?

每一个WORD 类型占两个字节,每一个选择节省五个字节.微笑

现在开始吧:

 

编写环境:VS.NET 2005 C++ MFC

首先定义宏:

#define WEEK_1           0x0001 
#define WEEK_2           0x0002 
#define WEEK_3           0x0004
#define WEEK_4           0x0008
#define WEEK_5           0x0010 
#define WEEK_6           0x0020 
#define WEEK_7           0x0040 

 

0x0001

0x:十六进制的标志.

0001:四位十六进制,正好两个字节.

为什么使用0x0001,0x0002, 0x0004,0x0008 ..这样值呢,因为这样的值用二进制表示的话,每一个常量只会有一位是1,其它位都是0.

例如:

0x0001=0000 0000 0000 0001

0x0002=0000 0000 0000 0010

0x0004=0000 0000 0000 0100

0x0008=0000 0000 0000 1000

 

然后,定义一个WORD变量 dwSet;

 

判断每个复选框的选择.以下为伪代码:

if (星期一被选中) dwSet +=WEEK_1;

if (星期二被选中) dwSet +=WEEK_2;

if (星期三被选中) dwSet +=WEEK_3;

if (星期四被选中) dwSet +=WEEK_4;

....

 

好了,现在 dwSet 已经获取了对星期的选择.可以肯定的是,dwSet 中的1的位置,就是被选中的项.

 

最后,怎样从 dwSet 获取用户的选择呢?

请看下面伪代码:

 

if(dwSet & WEEK_1) 星期一被选中

if(dwSet & WEEK_2) 星期二被选中

if(dwSet & WEEK_3) 星期三被选中

if(dwSet & WEEK_4) 星期四被选中

....

 

&: 与 运算表示符.

 

dwSet & WEEK_1  : 表示用 dwSet 变量和宏 WEEK_1 进行 与 运算.如果 dwSet 和 宏 WEEK_1 中对应的标志位 (即 0000 0000 0000 0001) 都为 1 时,即结果不为 0.那么就可以断定星期一被选中了.

 

OK!

 

其实 宏 有很多的用途,这只是其中一种比较典型的用法.

<完>

 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值