二級(jí)C宏--智者的利刃,愚者的惡夢(mèng)(下)

字號(hào):

例四、用C宏,智者思維的火花說(shuō)了半天了,嘴皮子都干了,舉個(gè)例子大家輕松一下——看看人家老外是怎么用宏的。這個(gè)例子摘自《C專(zhuān)家編程》。 根據(jù)位模式構(gòu)建圖形圖標(biāo)(icon)或者圖形(glyph),是一種小型的位模式映射于屏幕產(chǎn)生的圖像。一個(gè)位代表圖像上的一個(gè)像素。如果一個(gè)位被設(shè)置,那么它所代表的像素就是“亮”的。如果一個(gè)位被清除,那么它所代表的像素就是“暗”的。所以,一系列的整數(shù)值能夠用于為圖像編碼。類(lèi)似Iconedit這樣的工具就是用于繪圖的,他們所輸出的是一個(gè)包含一系列整型數(shù)的ASCII文件,可以被一個(gè)窗口程序所包含。它所存在的問(wèn)題是程序中的圖標(biāo)只是一串十六進(jìn)制數(shù)。在C語(yǔ)言中,典型的16X16的黑白圖形可能如下:
    static unsigned short stopwatch[] = {
    0x07C6,
    0x1FF7,
    0x383B,
    0x600C,
    0x600C,
    0xC006,
    0xC006,
    0xDF06,
    0xC106,
    0xC106,
    0x610C,
    0x610C,
    0x3838,
    0x1FF0,
    0x07C0,
    0x0000
    };
    正如所看到的那樣,這些C語(yǔ)言常量并未有提供有關(guān)圖形實(shí)際模樣的任何線索。這里有一個(gè)驚人的#define定義的優(yōu)雅集合,允許程序建立常量使它們看上去像是屏幕上的圖形。
    #define X )*2+1
    #define _ )*2
    #define s ((((((((((((((((0 /* For building glyphs 16 bits wide */
    定義了它們之后,只要畫(huà)所需要的圖標(biāo)或者圖形等,程序會(huì)自動(dòng)創(chuàng)建它們的十六進(jìn)制模式。使用這些宏定義,程序的自描述能力大大加強(qiáng),上面這個(gè)例子可以轉(zhuǎn)變?yōu)椋?BR>    static unsigned short stopwatch[] =
    {
    s _ _ _ _ _ X X X X X _ _ _ X X _ ,
    s _ _ _ X X X X X X X X X _ X X X ,
    s _ _ X X X _ _ _ _ _ X X X _ X X ,
    s _ X X _ _ _ _ _ _ _ _ _ X X _ _ ,
    s _ X X _ _ _ _ _ _ _ _ _ X X _ _ ,
    s X X _ _ _ _ _ _ _ _ _ _ _ X X _ ,
    s X X _ _ _ _ _ _ _ _ _ _ _ X X _ ,
    s X X _ X X X X X _ _ _ _ _ X X _ ,
    s X X _ _ _ _ _ X _ _ _ _ _ X X _ ,
    s X X _ _ _ _ _ X _ _ _ _ _ X X _ ,
    s _ X X _ _ _ _ X _ _ _ _ X X _ _ ,
    s _ X X _ _ _ _ X _ _ _ _ X X _ _ ,
    s _ _ X X X _ _ _ _ _ X X X _ _ _ ,
    s _ _ _ X X X X X X X X X _ _ _ _ ,
    s _ _ _ _ _ X X X X X _ _ _ _ _ _ ,
    s _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
    };
    顯然,與前面的代碼相比,它的意思更為明顯。標(biāo)準(zhǔn)的C語(yǔ)言具有八進(jìn)制、十進(jìn)制和十六進(jìn)制常量,但沒(méi)有二進(jìn)制常量,否則的話倒是一種更為簡(jiǎn)單的繪制圖形模式的方法。
    如果抓住書(shū)的右上角,并斜這看這一頁(yè),可能會(huì)猜測(cè)這是一個(gè)用于流行窗口系統(tǒng)的“cursor busy”小秒表圖形。我是在幾年前從Usenet comp.lang.c新聞組學(xué)到這個(gè)技巧的。
    千萬(wàn)不要忘了在繪圖結(jié)束后清除這些宏定義,否這很可能會(huì)給你后面的代碼帶來(lái)不可預(yù)測(cè)的后果。
    好了,今天的廢話就到這里了。水能載舟,亦能覆舟,把握好手中的雙刃劍,讓它好好的為你服務(wù)吧,別割破了手。 (完)