例四、用C宏,智者思維的火花說了半天了,嘴皮子都干了,舉個例子大家輕松一下——看看人家老外是怎么用宏的。這個例子摘自《C專家編程》。 根據位模式構建圖形圖標(icon)或者圖形(glyph),是一種小型的位模式映射于屏幕產生的圖像。一個位代表圖像上的一個像素。假如一個位被設置,那么它所代表的像素就是“亮”的。假如一個位被清除,那么它所代表的像素就是“暗”的。所以,一系列的整數值能夠用于為圖像編碼。類似Iconedit這樣的工具就是用于繪圖的,他們所輸出的是一個包含一系列整型數的ASCII文件,可以被一個窗口程序所包含。它所存在的問題是程序中的圖標只是一串十六進制數。在C語言中,典型的16X16的黑白圖形可能如下:static unsigned short stopwatch[] = {0x07C6,0x1FF7,0x383B,0x600C,0x600C,0xC006,0xC006,0xDF06,0xC106,0xC106,0x610C,0x610C,0x3838,0x1FF0,0x07C0,0x0000}; 正如所看到的那樣,這些C語言常量并未有提供有關圖形實際模樣的任何線索。這里有一個驚人的#define定義的優雅集合,答應程序建立常量使它們看上去像是屏幕上的圖形。 #define X )*2+1#define _ )*2#define s ((((((((((((((((0 /* For building glyphs 16 bits wide */ 定義了它們之后,只要畫所需要的圖標或者圖形等,程序會自動創建它們的十六進制模式。使用這些宏定義,程序的自描述能力大大加強,上面這個例子可以轉變為: 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 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _}; 顯然,與前面的代碼相比,它的意思更為明顯。標準的C語言具有八進制、十進制和十六進制常量,但沒有二進制常量,否則的話倒是一種更為簡單的繪制圖形模式的方法。