宏的使用 extern


聲明全局變量使用的技術。

有些時候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文件中定義一次就可以了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM