深入uCOS中全局變量的使用詳解
在C語言編程中經(jīng)常會(huì)遇到全局變量。全局變量的定義一般采用下面的方式
.C文件中定義
unsigned int gVariable;
.h文件中聲明
extern unsigned int gVariable;
這樣做的目的是防止變量重復(fù)聲明,提高編譯效率。但是如果這樣的定于如果安排不好就會(huì)出現(xiàn)各種各樣的問題。在編譯時(shí)重復(fù)的聲明,甚至出現(xiàn)錯(cuò)誤。
閱讀邵貝貝翻譯的《uC/OS-II》一書,發(fā)現(xiàn)里面用了一種非常巧妙的全局變量定義的方法,下面就自己的理解做一下記錄,算是自己的筆記。也寫出來和大家共同學(xué)習(xí)。
uC/OS-II中定義了一全局使用的頭文件includes.h。這個(gè)文件在任意一個(gè).C 文件中引用。
在每一個(gè).H文件中定義了這樣一個(gè)宏。\
#ifdef XXX_GLOBALS
#define XXX_EXT
#else
#define XXX_EXT extern
#endif
.H 文件中每個(gè)全局變量都加上了xxx_EXT的前綴。xxx代表模塊的名字。該模塊的.C文件中有以下定義:
#define XXX_GLOBALS
#include "includes.h"
當(dāng)編譯器處理.C文件時(shí),它強(qiáng)制xxx_EXT(在相應(yīng).H文件中可以找到)為空,(因?yàn)閤xx_GLOBALS已經(jīng)定義)。所以編譯器給每個(gè)全局變量分配內(nèi)存空間,而當(dāng)編譯器處理其他.C文件時(shí),xxx_GLOBAL沒有定義,xxx_EXT被定義為extern,這樣用戶就可以調(diào)用外部全局變量。為了說明這個(gè)概念,可以參見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;
同時(shí),uCOS_II.H有中以下定義:
#define OS_GLOBALS
#include "includes.h"
當(dāng)編譯器處理uCOS_II.C時(shí),它使得頭文件變成如下所示,因?yàn)镺S_EXT被設(shè)置為空。
INT32U OSIdleCtr;
INT32U OSIdleRun;
INT32U OSIdleMax;
這樣編譯器就會(huì)將這些全局變量分配在內(nèi)存中。當(dāng)編譯器處理其他.C文件時(shí),頭文件變成了如下的樣子,因?yàn)镺S_GLOBAL沒有定義,所以O(shè)S_EXT被定義為extern。
extern INT32U OSIdleCtr;
extern INT32U OSIdleRun;
extern INT32U OSIdleMax;
在這種情況下,不產(chǎn)生內(nèi)存分配,而任何 .C文件都可以使用這些變量。這樣的就只需在 .H 文件中定義一次就可以了。
相關(guān)文章
gazebo里通過節(jié)點(diǎn)發(fā)布topic讓關(guān)節(jié)轉(zhuǎn)動(dòng)實(shí)現(xiàn)詳解
這篇文章主要介紹了gazebo里通過節(jié)點(diǎn)發(fā)布topic讓關(guān)節(jié)轉(zhuǎn)動(dòng)實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12C++設(shè)計(jì)模式之適配器模式(Adapter)
這篇文章主要為大家詳細(xì)介紹了C++設(shè)計(jì)模式之適配器模式Adapter,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-03-03VC++進(jìn)度條process Bar的用法實(shí)例
這篇文章主要介紹了VC++進(jìn)度條process Bar的用法,是進(jìn)行VC++應(yīng)用程序開發(fā)中非常常見的實(shí)用技巧,需要的朋友可以參考下2014-10-10C++實(shí)現(xiàn)LeetCode(74.搜索一個(gè)二維矩陣)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(74.搜索一個(gè)二維矩陣),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07