音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費(fèi)注冊(cè) 首頁(yè) | 行業(yè)黑名單 | 幫助
維庫(kù)電子市場(chǎng)網(wǎng)
技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測(cè)控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng)
驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe

我想在一個(gè)公共的頭文件中定義全局變量?該怎么處理呢?

作者:風(fēng)... 欄目:單片機(jī)
我想在一個(gè)公共的頭文件中定義全局變量?該怎么處理呢?
比如我想把所有的頭文件都放到include.h中,這樣每個(gè).c文件只要一個(gè)#include include.h就可以了,大家好像也都是這么做的,uC/OS也是這么干的。
但每次總是提示重復(fù)定義,沒(méi)辦法還得放到各個(gè).c文件中分別定義。全局變量必須分別放到各個(gè).c文件中嗎?怎么能放到一個(gè)頭文件中呢?
因?yàn)橛械男枰獛А癳xtern”,而其他的不需要!納悶

大師指點(diǎn)一下!

* - 本貼最后修改時(shí)間:2006-4-24 10:34:47 修改者:風(fēng)...

2樓: >>參與討論
computer00
在某一個(gè).c文件中定義一個(gè)全局變量,然后在.h文件中使用extern
例如:(某某.c文件)

int x;

(某某.h文件)

extern int x;

3樓: >>參與討論
風(fēng)...
哦?那這樣做為什么不會(huì)造成重復(fù)定義呢?
因?yàn)樵谶@個(gè)C文件中,有:
int x;
同時(shí)在這個(gè)C文件的開(kāi)頭因?yàn)橛辛?include "include.h"
所以這個(gè)C文件又有了:
extern int x;

這豈不……???
我試了一下,keil卻沒(méi)提示任何警告!


4樓: >>參與討論
computer00
因?yàn)榧恿薳xtern,表示聲明,不是定義。
定義在int x;處,定義只能有一處,而聲明可以有多處,聲明是不會(huì)報(bào)錯(cuò)的,而重復(fù)定義則不行。

5樓: >>參與討論
風(fēng)...
oh,I see I see,非常感謝computer00大師指點(diǎn)!
非常、非常感謝!
多有打擾,謝啦^_^

6樓: >>參與討論
風(fēng)...
在網(wǎng)上發(fā)現(xiàn)一篇這個(gè)問(wèn)題的重要帖子,據(jù)說(shuō)是uC/OS-II里的
以下是如何定義全局變量。
眾所周知,全局變量應(yīng)該是得到內(nèi)存分配且可以被其他模塊通過(guò)C語(yǔ)言中extern關(guān)鍵字調(diào)用的變量。因此,必須在 .C 和 .H 文件中定義。這種重復(fù)的定義很容易導(dǎo)致錯(cuò)誤。以下討論的方法只需用在頭文件中定義一次。雖然有點(diǎn)不易懂,但用戶(hù)一旦掌握,使用起來(lái)卻很靈活。
表1.2中的定義出現(xiàn)在定義所有全局變量的.H頭文件中。

程序清單 L 1.2    定義全局宏。
#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沒(méi)有定義,xxx_EXT被定義為extern,這樣用戶(hù)就可以調(diào)用外部全局變量。為了說(shuō)明這個(gè)概念,可以參見(jiàn)uC/OS_II.H,其中包括以下定義:

#ifdef   OS_GLOBALS
#define  OS_EXT
#else
#define  OS_EXT extern
#endif

OS_EXT  INT32U       OSIdleCtr;
OS_EXT  INT32U       OSIdleCtrRun;
OS_EXT  INT32U       OSIdleCtrMax;

同時(shí),uCOS_II.H有中以下定義:

#define  OS_GLOBALS
#include “includes.h”

當(dāng)編譯器處理uCOS_II.C時(shí),它使得頭文件變成如下所示,因?yàn)镺S_EXT被設(shè)置為空。

INT32U       OSIdleCtr;
INT32U       OSIdleCtrRun;
INT32U       OSIdleCtrMax;
    
這樣編譯器就會(huì)將這些全局變量分配在內(nèi)存中。當(dāng)編譯器處理其他.C文件時(shí),頭文件變成了如下的樣子,因?yàn)镺S_GLOBAL沒(méi)有定義,所以O(shè)S_EXT被定義為extern。

extern INT32U       OSIdleCtr;
extern INT32U       OSIdleCtrRun;
extern INT32U       OSIdleCtrMax;
    
在這種情況下,不產(chǎn)生內(nèi)存分配,而任何 .C文件都可以使用這些變量。這樣的就只需在 .H 文件中定義一次就可以了。

//-------------------------------
意思好像是只在頭文件里定義就可以了,剛發(fā)現(xiàn),沒(méi)細(xì)看呢!
據(jù)說(shuō)是uC/OS-II里的,這個(gè)東西我也在看呢,居然還沒(méi)發(fā)現(xiàn)!

7樓: >>參與討論
風(fēng)...
看了一下,也并沒(méi)簡(jiǎn)單多少,還得在.c中多個(gè)#define,唉……
 
參與討論
昵稱(chēng):
討論內(nèi)容:
 
 
相關(guān)帖子
請(qǐng)幫我看看這個(gè)匯編程序,關(guān)于接受傳感器信號(hào)
pcf8563報(bào)警功能請(qǐng)教
求QuickStart
誰(shuí)最近手上有活干
浮點(diǎn)數(shù),如何知道它的數(shù)值
免費(fèi)注冊(cè)為維庫(kù)電子開(kāi)發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào)