久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標(biāo)題: c語言中的全局變量問題 [打印本頁]

作者: liuyang    時(shí)間: 2012-1-10 04:14
標(biāo)題: c語言中的全局變量問題
 猛然間從前不是問題的問題成為了最主要的問題:c語言中的全局變量。
可能大家對(duì)這個(gè)不是太了解,因?yàn)闊o論是老師說的還是課本上印的都是盡量少使用全局變量。之前從考試的角度說對(duì)這句話有印象,不過當(dāng)用的時(shí)候早就拋九霄云外了。所以一直沒留意。如果仔細(xì)觀察你會(huì)發(fā)現(xiàn)在單片機(jī)編程中充斥著各種各樣的全局變量甚至是全局變量的初始化,由于本人能力有限,所以解決這兩個(gè)問題主要是引述在論壇上各位大蝦的言論。以此來自勉以及為日后的復(fù)習(xí)工作做準(zhǔn)備。
1全局變量,據(jù)說你很危險(xiǎn)?
第一點(diǎn):我不同意樓上幾位關(guān)于全局變量和單件模式的論述,雖然單件模式是通過全局變量實(shí)現(xiàn)的,但是很明顯全局變量并不等于單件模式 聽你們說的總感覺很別扭,...
全局變量有很多弊端,比如說全局變量維護(hù)起來不是那么清晰,別人看你的代碼也會(huì)覺得不那么直接,如果很多地方用到,到處都是extern,處理中如果出了問題,排查也增加了自己的復(fù)雜
?
所以說應(yīng)該盡量避免使用,但也不是絕對(duì)不能用,當(dāng)有些時(shí)候想不到更好的替代方案時(shí),該用還是要用,另外goto語句也是一樣。
 
存在及合理,但只有在合適的情況下才使用,比如為了提高效率,在單片機(jī)程序,arm程序,dsp程序里面,全局變量滿天飛
不過在pc機(jī)上,隨著機(jī)器性能越來越高,這個(gè)已經(jīng)不是最關(guān)注的問題,設(shè)計(jì)者更應(yīng)注重程序的可維護(hù)性和可擴(kuò)展性,而全局變量往往會(huì)破壞這些,所以應(yīng)盡量避免。

人生都是在取舍 程序 ,全局變量的使用根據(jù)你的情況自己考慮是用還是不用。

如果變量使用不多 獲取指針又比較方便 為了安全起見 還是定義成局部的好。
 
以前敏捷開發(fā)的要求要重構(gòu)。說函數(shù)要短,可復(fù)用性要高。我也以為這是圣經(jīng)。后來到了單片機(jī)里這樣做就是傻瓜了。因?yàn)閱纹瑱C(jī)里邊進(jìn)一個(gè)函數(shù)就要進(jìn)棧出棧,白白浪費(fèi)時(shí)鐘周期,本來沒必要的函數(shù)調(diào)用能省就省了。而且很多時(shí)候根本沒有那么多臨時(shí)存儲(chǔ)的地方給你用。想瘋狂調(diào)用函數(shù),玩?zhèn)遞歸啥的,還是免了吧。。。全局變量么,能用就用吧。因?yàn)槿绻志驼家粋(gè)存儲(chǔ)空間,分散了之后沒準(zhǔn)就需要幾個(gè)。劃不來。變量名字也往短了起,計(jì)算上的東西就已經(jīng)很頭大了,再搞一堆長(zhǎng)長(zhǎng)的名字真是打擾心情。還有中斷,才知道多么珍貴,要嚴(yán)格控制不要兩個(gè)同時(shí)進(jìn)來,而且中斷函數(shù)不能重入。。。反正,具體應(yīng)用很關(guān)鍵。不能形而上學(xué)。。。
控制全局變量的總量,太多了要出麻煩

全局變量是一把雙刃劍,?使用全局變量還是指針來作為函數(shù)數(shù)據(jù)訪問的接口要看什么時(shí)候、怎么用還要自己慢慢摸索。
 
 
2.全局變量的初始化
關(guān)于全局變量的初始化,c語言和c++是有區(qū)別的。在c語言中,只能用常數(shù)對(duì)全局變量進(jìn)行初始化,否則編譯器會(huì)報(bào)錯(cuò)。在c++中,如果在一個(gè)文件中定義了int a = 5;...
對(duì)于不同編譯單位的全局變量,其初始化的順序沒有任何的保證,因此對(duì)不同編譯單位里的全局變量,在它們的初始化順序之間建立依賴性都是不明智的。
此外也沒辦法捕捉到全局變量初始化拋出的異常,一般來說要減少全局變量的使用,特別是限制那些要求復(fù)雜初始化的全局變量。so: 1,盡量不用全局變量
2,用靜態(tài)變量,通過訪問器進(jìn)行訪問
例如:全局變量
int a = 5;
int b = a;
如果a,和b定義在同一個(gè)文件里,那沒什么問題,結(jié)果b等于5.
如果a和b定義在不同文件里,就不能保證b也等于5,也就是說不能保證a先初始化.
事實(shí)上,除了在同一個(gè)文件定義的全局對(duì)象的初始化是按照定義次序來進(jìn)行的之外,其他全局或靜態(tài)變量之間的初始化次序沒有任何保障。解決這種問題的方法是不直接使用全局變量,而改用一個(gè)包裝函數(shù)來訪問,例如
int get_a()
{
static int a = 5;
return a;
}
int get_b()
{
static int b = get_a();
return b;
}

這樣的話,無論get_a和get_b是否定義在同一個(gè)文件中,get_b總是能夠返回正確的結(jié)果,原因在于,函數(shù)內(nèi)部的靜態(tài)變量是在第一次訪問的時(shí)候來初始化。
任何時(shí)候,如果在不同的被編譯單元中定義了"非局部靜態(tài)對(duì)象",并且這些對(duì)象的正確行為依賴于它們被初始化的某一特定順序,就會(huì)產(chǎn)生問題.你絕對(duì)無法控制不同被編譯單元中非局部靜態(tài)對(duì)象的初始化順序.對(duì)于函數(shù)中的靜態(tài)對(duì)象(即"局部"靜態(tài)對(duì)象)它們?cè)诤瘮?shù)調(diào)用過程中初次碰到對(duì)象的定義時(shí)被初始化..
PS:千萬不要寫出和編譯順序相關(guān)的程序來。

關(guān)于全局變量的初始化,C語言和C++是有區(qū)別的。
在C語言中,只能用常數(shù)對(duì)全局變量進(jìn)行初始化,否則編譯器會(huì)報(bào)錯(cuò)。
在C++中,如果在一個(gè)文件中定義了int a = 5;要在另一個(gè)文件中定義int b = a;的話,前面必須對(duì)a進(jìn)行聲明:extern int a;否則編譯不通過.、即使是這樣,int b = a;這句話也是分兩步進(jìn)行的:在編譯階段,編譯器把b當(dāng)作是未初始化數(shù)據(jù)而將它初始化為0;在執(zhí)行階段,在main被執(zhí)行前有一個(gè)全局對(duì)象的構(gòu)造過程,int b = a;被當(dāng)作是int型對(duì)象b的拷貝初始化構(gòu)造來執(zhí)行。
其實(shí),準(zhǔn)確地說,在C++中全局對(duì)象、變量的初始化是獨(dú)立的,如果不是象int a = 5;這樣的已初始化數(shù)據(jù),那么就是象b這樣的未初始化數(shù)據(jù)。
而C++中全局對(duì)象、變量的構(gòu)造函數(shù)調(diào)用順序是跟聲明有一定關(guān)系的,即在同一個(gè)文件中先聲明的先調(diào)用。對(duì)于不同文件中的全局對(duì)象、變量,它們的構(gòu)造函數(shù)調(diào)用順序是未定義的,取決于具體的編譯器。
作者: pcbcopy    時(shí)間: 2012-1-10 16:13
來占座的。。。




歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 色偷偷噜噜噜亚洲男人 | 欧美日韩国产一区二区 | 日韩一级在线观看 | 色播久久 | 日韩一级免费视频 | 999国产视频| 国产中文字幕在线 | 亚洲欧美在线视频 | 五月天久久久 | 黄色大片视频 | 亚洲国产成人精品女人久久久 | 国产h视频 | 国产福利视频 | 欧美 日韩 国产 成人 在线 | 欧美一级特黄视频 | 成人影| 欧美激情视频一区二区 | 日本高清中文字幕 | 青青艹在线视频 | 国产欧美精品一区二区 | 国产亚洲精品码 | 一色桃子av | 日韩超碰 | 亚洲天堂网在线观看 | 日本黄色免费网站 | 伊人久久国产 | 91av导航| 国产91免费 | 日韩精品在线播放 | 国内精品国产成人国产三级 | 在线观看欧美日韩 | 日韩欧美黄色片 | 国产精品视频网站 | 免费网站观看www在线观看 | 亚洲色网址 | 看毛片网站 | 黄色三级视频网站 | 日日操天天操 | 亚洲一级在线 | 中日韩毛片 | 成人午夜视频在线观看 |