這幾天我在研讀uc/os II 源碼時發現它提供的程式設計方法能非常有效地解決上述標題的難題。它主要是通過#ifdef 預先處理指令來實現的。
先說說extern能造成什麼混亂吧!
假如現在有5個檔案,分別為:main.c , hello.c , flow.c, etc.c , include.h.
如果在main.c中定義一些全域變數,如下:
char obu_channel
char obu_info
char obu_mac
但是,我們需要在hello.c flow.c etc.c中用到這幾個變數,通常我們會在這三個檔案中添加extern關鍵字,然後就可以正常使用了。但是這樣並不能使程式變的簡潔,如果是小程式,這樣寫無所謂,但是如果是大工程,大項目的時候,我們就應該考慮到這樣一個問題:假使每個*.c檔案都調用其它檔案的全域變數,再假使這種類型的全域變數非常多,你如何對它們進行有效管理而使它變的簡潔呢?或者在某一時刻,你想查看此變數的具體定義位置,你可能無從下手了,你看,混亂吧!好的,下面我們就來解決它。
我們可以將這幾個變數定義在include.h檔案中,定義的內容如下:
#ifdef GLOBAL
#define _EXT_
#else
#define _EXT_ extern
#endif
_EXT_ char obu_channel
_EXT_ char obu_info
_EXT_ char obu_mac
然後我們在main.c中包含 include.h標頭檔,並在main.c中加入:#define GLOBAL, 編譯器在編譯時間就對它進行記憶體的分配,這相當於是在main.c中定義了3個全域變數。就如同在main.c中定義了:
char obu_channel
char obu_info
char obu_mac
而如果hello.c和flow.c以及etc.c這三個檔案需要使用這三個變數的時候,(如果我們未定義#define GLOBAL)_EXT_就會被替換成extern, 系統自動的添加為extern,以表時這些變數是來自其它檔案定義的,此時情況如下:
extern
char obu_channel
extern
char obu_info
extern
char obu_mac
這樣就可以很方便的對全域變數進行統一的管理了,並且可以使程式變得更加簡潔。這個方法好吧!~~ 這也算是個小技巧吧,看來ucos II還是有的看頭,可以借鑒裡面的編程方法,提高自己的技能。多研讀大師的傑作總有好處,加油!~~