---=====宏的使用方法=====---
<原创>需转载请加上标题.
作者:吴金勇
最近做项目需要记录许多用户选择.例如记录用户选择的星期.
用笨方法的话,就用结构吧.
例如
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!
其实 宏 有很多的用途,这只是其中一种比较典型的用法.
<完>