聲明全局變量使用的技術。
有些時候C語言的一些條條框框就像語法。學會C語言就是學會了語法。
但是語法怎樣使用就又是另一回事了。
我希望自己能多學習一些技巧,而不是一些固定的C語言語法。
這篇文章真的很好:參考:http://blog.chinaunix.net/uid-2282111-id-2113225.html
是關於如何定義全局變量的。
之前在我沒有看μC/OS的時候,寫過時間片輪轉的程序。
那個時候定義全局變量真的很痛苦,總是報錯說某某文件已經定義了。
后來才知道,可以在oled.c里面定義一個變量cnt.
如果你想讓主函數,或者其他的文件(如key.c)也用到這個cnt,
就需要在oled.h文件中加入extern int cnt
這樣就可以在main.c或者key.c中定義#include"oled.h" ,就可以在main.c或key.c中調用cnt變量了.
但是這里講的是另一種方法:
以下是如何定義全局 變量。眾所周知,全局變量應該是得到內存分配且可以被其他模塊通過C 語言中extern 關鍵字調用的變量。因此,必須在 .C 和 .H 文件中定義。這種重復的定義很容易導致錯誤。以下討論的方法只需用在頭文件中定義一次。雖然有點不易懂,但用戶一旦掌握,使用起來卻很靈活。表1.2 中的定義出現在定義所有全局變量的.H 頭文件中。
程序清單 L 1.2 定義全局宏。
#ifdef xxx_GLOBALS
#define xxx_EXT
#else
#define xxx_EXT extern
#endif
.H 文件中每個全局變量都加上了xxx_EXT 的前綴。xxx 代表模塊的名字。該模塊的.C 文件中有以下定義:
#define xxx_GLOBALS
#i nclude "includes.h"
當 編譯器處理.C 文件時,它強制xxx_EXT(在相應.H文件中可以找到)為空,(因為xxx_GLOBALS已經定義)。所以編譯器給每個全局變量分配內存空間,而當 編譯器處理其他.C 文件時,xxx_GLOBAL 沒有定義,xxx_EXT 被定義為extern,這樣用戶就可以調用外部全局變量。為了說明這個概念,可以參見uC/OS_II.H,其中包括以下定義:
#ifdef OS_GLOBALS
#define OS_EXT //這句話可以理解為把 OS_EXT定義成 ' ' ,也就是定義成空格的意思.
#else
#define OS_EXT extern
#endif
OS_EXT INT32U OSIdleCtr;
OS_EXT INT32U OSIdleCtrRun;
OS_EXT INT32U OSIdleCtrMax;
同時,uCOS_II.H 有中以下定義:
#define OS_GLOBALS
#i nclude “includes.h”
當編譯器處理uCOS_II.C 時,它使得頭文件變成如下所示,因為OS_EXT 被設置為空。
INT32U OSIdleCtr;
INT32U OSIdleCtrRun;
INT32U OSIdleCtrMax;
這樣編譯器就會將這些全局變量分配在內存中。當編譯器處理其他.C 文件時,頭文件變成了如下的樣子,因為OS_GLOBAL 沒有定義,所以OS_EXT 被定義為extern。
extern INT32U OSIdleCtr;
extern INT32U OSIdleCtrRun;
extern INT32U OSIdleCtrMax;
在這種情況下,不產生內存分配,而任何 .C 文件都可以使用這些變量。這樣的就只需在 .H文件中定義一次就可以了。