巨集的使用方法

2021-04-13 22:41:22 字數 1776 閱讀 3022

---*****巨集的使用方法*****---

最近做專案需要記錄許多使用者選擇.例如記錄使用者選擇的星期.

用笨方法的話,就用結構吧.

例如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...