深入uCOS中全域變數的使用詳解

來源:互聯網
上載者:User

在C語言編程中經常會遇到全域變數。全域變數的定義一般採用下面的方式

.C檔案中定義

unsigned int gVariable;

.h檔案中聲明

extern unsigned int gVariable;

這樣做的目的是防止變數重複聲明,提高編譯效率。但是如果這樣的定於如果安排不好就會出現各種各樣的問題。在編譯時間重複的聲明,甚至出現錯誤。

閱讀邵貝貝翻譯的《uC/OS-II》一書,發現裡面用了一種非常巧妙的全域變數定義的方法,下面就自己的理解做一下記錄,算是自己的筆記。也寫出來和大家共同學習。

uC/OS-II中定義了一全域使用的標頭檔includes.h。這個檔案在任意一個.C 檔案中引用。

在每一個.H檔案中定義了這樣一個宏。\

複製代碼 代碼如下:#ifdef XXX_GLOBALS

#define XXX_EXT

#else

#define XXX_EXT extern

#endif

.H 檔案中每個全域變數都加上了xxx_EXT的首碼。xxx代表模組的名字。該模組的.C檔案中有以下定義:

#define XXX_GLOBALS

#include "includes.h"

當編譯器處理.C檔案時,它強制xxx_EXT(在相應.H檔案中可以找到)為空白,(因為xxx_GLOBALS已經定義)。所以編譯器給每個全域變數分配記憶體空間,而當編譯器處理其他.C檔案時,xxx_GLOBAL沒有定義,xxx_EXT被定義為extern,這樣使用者就可以調用外部全域變數。為了說明這個概念,可以參見uC/OS_II.H,其中包括以下定義:

複製代碼 代碼如下:#ifdef OS_GLOBALS

#define OS_EXT

#else

#define OS_EXT extern

#endif

OS_EXT INT32U OSIdleCtr;

OS_EXT INT32U OSIdleRun;

OS_EXT INT32U OSIdleMax;

同時,uCOS_II.H有中以下定義:

#define OS_GLOBALS

#include "includes.h"

當編譯器處理uCOS_II.C時,它使得標頭檔變成如下所示,因為OS_EXT被設定為空白。

INT32U OSIdleCtr;

INT32U OSIdleRun;

INT32U OSIdleMax;

這樣編譯器就會將這些全域變數分配在記憶體中。當編譯器處理其他.C檔案時,標頭檔變成了如下的樣子,因為OS_GLOBAL沒有定義,所以OS_EXT被定義為extern。

extern INT32U OSIdleCtr;

extern INT32U OSIdleRun;

extern INT32U OSIdleMax;

在這種情況下,不產生記憶體配置,而任何 .C檔案都可以使用這些變數。這樣的就只需在 .H 檔案中定義一次就可以了。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.