程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C >> C語言基礎知識 >> 深入uCOS中全局變量的使用詳解

深入uCOS中全局變量的使用詳解

編輯:C語言基礎知識

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved