維尼的蜂巢

RealTime??!! It’s amazing!!!!

C的巨集使用技巧2 四月 5, 2006

Filed under: VC++/C++/C — kevinlin @ 9:51 下午

要介紹的第二個使用技巧是
利用二進位運算式得到編譯時期常數 

另外一個特殊運算元是##
這個運算元能讓你把兩個參數連接起來,如下所示:

#define cat(a,b)      a ## b
value = cat (1,2);
錢至處理器會把上面這行轉成
value=12;
雖然說這個簡單的例子沒有什麼實際的用處(demo用而已),但是可以看見##運算元確實有一些很有趣的用處。常在微軟的一些程式中會發現,可見他有時還蠻實用的。
下面的技巧就可以讓你利用二進位運算式建立編譯時期的常數。這裡特別有趣的是所有下面的程式碼都是在前至處理器裡面處理的,沒有一行執行時的程式碼。

/*
//Usage
const int nibble = BINARY1(0101);       // 0x5
const int byte   = BINARY2(1010,0101);  // 0xa5

// 0xa5a5a5a5
const int dword = BINARY8(1010,0101,1010,0101,1010,0101,1010,0101);
*/

//Macro source:

#define HEX_DIGIT_0000 0
#define HEX_DIGIT_0001 1
#define HEX_DIGIT_0010 2
#define HEX_DIGIT_0011 3
#define HEX_DIGIT_0100 4
#define HEX_DIGIT_0101 5
#define HEX_DIGIT_0110 6
#define HEX_DIGIT_0111 7
#define HEX_DIGIT_1000 8
#define HEX_DIGIT_1001 9
#define HEX_DIGIT_1010 a
#define HEX_DIGIT_1011 b
#define HEX_DIGIT_1100 c
#define HEX_DIGIT_1101 d
#define HEX_DIGIT_1110 e
#define HEX_DIGIT_1111 f

#define HEX_DIGIT(a)        HEX_DIGIT_ ## a

#define BINARY1H(a)         (0x ## a)
#define BINARY1I(a)         BINARY1H(a)
#define BINARY1(a)          BINARY1I(HEX_DIGIT(a))

#define BINARY2H(a,b)       (0x ## a ## b)
#define BINARY2I(a,b)       BINARY2H(a,b)
#define BINARY2(a,b)        BINARY2I(HEX_DIGIT(a), HEX_DIGIT(b))

#define BINARY8H(a,b,c,d,e,f,g,h) (0x##a##b##c##d##e##f##g##h)
#define BINARY8I(a,b,c,d,e,f,g,h) BINARY8H(a,b,c,d,e,f,g,h)
#define BINARY8(a,b,c,d,e,f,g,h)  BINARY8I(HEX_DIGIT(a),    \
 HEX_DIGIT(b), HEX_DIGIT(c), HEX_DIGIT(d), HEX_DIGIT(e),    \
 HEX_DIGIT(f), HEX_DIGIT(g), HEX_DIGIT(h))

 

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 變更 )

Twitter picture

You are commenting using your Twitter account. Log Out / 變更 )

Facebook照片

You are commenting using your Facebook account. Log Out / 變更 )

Google+ photo

You are commenting using your Google+ account. Log Out / 變更 )

連結到 %s