|
|||||||||||
| 技術(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ī) |
比如我想把所有的頭文件都放到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 于 2006/4/24 10:43:00 發(fā)布:
在某一個(gè).c文件中定義一個(gè)全局變量,然后在.h文件中使用extern 例如:(某某.c文件) int x; (某某.h文件) extern int x; |
|
| 3樓: | >>參與討論 |
| 作者: 風(fēng)... 于 2006/4/24 11:10:00 發(fā)布:
哦?那這樣做為什么不會(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 于 2006/4/24 11:15:00 發(fā)布:
因?yàn)榧恿薳xtern,表示聲明,不是定義。 定義在int x;處,定義只能有一處,而聲明可以有多處,聲明是不會(huì)報(bào)錯(cuò)的,而重復(fù)定義則不行。 |
|
| 5樓: | >>參與討論 |
| 作者: 風(fēng)... 于 2006/4/24 11:32:00 發(fā)布:
oh,I see I see,非常感謝computer00大師指點(diǎn)! 非常、非常感謝! 多有打擾,謝啦^_^ |
|
| 6樓: | >>參與討論 |
| 作者: 風(fēng)... 于 2006/4/24 11:45:00 發(fā)布:
在網(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)... 于 2006/4/24 13:39:00 發(fā)布:
看了一下,也并沒(méi)簡(jiǎn)單多少,還得在.c中多個(gè)#define,唉…… |
|
|
|
| 免費(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) |