---*****巨集的使用方法*****---
最近做專案需要記錄許多使用者選擇.例如記錄使用者選擇的星期.
用笨方法的話,就用結構吧.
例如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!
其實 巨集 有很多的用途,這只是其中一種比較典型的用法.
《完》
msgpack巨集使用方法
msgpack定義了幾個序列化巨集,使用這些巨集,可大大簡化我們的序列化的 可用的巨集如下 msgpack define 宣告要用msgpack序列化的變數 msgpack base 宣告要用msgpack序列化的基類型別 msgpack define array 以陣列 順序方式序列化 msgpa...
TRACE巨集的使用方法
trace巨集對於vc下程式除錯來說是很有用的東西,有著類似printf的功能 該巨集僅僅在程式的debug版本中出現,當release的時候該巨集就完全消失了,從而幫助你除錯也在release的時候減少 量。使用非常簡單,格式如下 trace ddddddddddd trace wewe d 33...
ifndef def endif等巨集使用方法
從 一般情況下,源程式中所有的行都參加編譯。但是有時希望對其中一部分內容只在滿足一定條件才進行編譯,也就是對一部分內容指定編譯的條件,這就是 條件編 譯 有時,希望當滿足某條件時對一組語句進行編譯,而當條件不滿足時則編譯另一組語句。條件編譯命令最常見的形式為 ifdef 識別符號 程式段1 else...