Sunday, April 02, 2006

Enjoy the Fine Code

在〈初等概念〉一文, Jserv 說道:

在我看來,C Programming Language 本來就是用來寫作業系統,所以相關的基礎知識也要有一定的理解,至少也需要對硬體有認知,這樣才有機會徹底理解 C 語言,而 C++ 就更不說了,不僅 ISO C++ spec 複雜難懂,又得遷就於 C++ compiler 許多不合標準但陳窠已久的特性,又得將其 OOPL 的理念貫徹於專案開發,這使得沒有對特定 domain knowledge 有足夠掌握者,難以透過 C++ 將其發揮得淋漓盡致。

由〈初等概念〉文末附的 links,我尋線逛到 Dan SaksEmbedded.com 發表的專欄,並發現許多精緻優雅的 C 程式片段,堪稱為程式中的小品文,值得好好駐足欣賞:

在〈Enumerations Q & A〉中,我看到 enumeration 的精彩用法:

1: enum currency
2:   {
3:   currency_before = -1,
4:   CAD, CHR, EUR, GBP, JPY, SFR, USD,
5:   currency_after,
6:   currency_min = currency_before+1,
7:   currency_max = currency_after-1,
8:   };

在〈More ways to map memory〉欣賞到漂亮的 special_register 使用方式:

 1: typedef unsigned int volatile special_register;
 2: 
 3: typedef struct dual_timers dual_timers;
 4: struct dual_timers
 5:     {
 6:     special_register TMOD;
 7:     special_register TDATA0;
 8:     special_register TDATA1;
 9:     special_register TCNT0;
10:     special_register TCNT1;
11:     };
12: 
13: enum { TE0 = 0x01, TE1 = 0x08 };
14: 
15: #define timers ((dual_timers *)0x03FF6000)
16: 
17: int main()
18:     {
19:     timers->TMOD &= ~(TE0 | TE1);
20:     timers->TDATA0 = 50000;
21:     return 0;
22:     }

在〈Place volatile accurately〉,意外發現 shadow register 的用法:

1: typedef uint32_t shadow_register;
2: typedef shadow_register volatile
3:     special_register;

...

此外,Jserv 在〈C99 的 offsetof macro〉引介的〈Learn a new trick with the offsetof() macro〉也很讓人激賞。

Tags: [] [] []

0 comments: