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

標題: c語言中的全局變量問題 [打印本頁]

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

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

如果變量使用不多 獲取指針又比較方便 為了安全起見 還是定義成局部的好。
 
以前敏捷開發的要求要重構。說函數要短,可復用性要高。我也以為這是圣經。后來到了單片機里這樣做就是傻瓜了。因為單片機里邊進一個函數就要進棧出棧,白白浪費時鐘周期,本來沒必要的函數調用能省就省了。而且很多時候根本沒有那么多臨時存儲的地方給你用。想瘋狂調用函數,玩個遞歸啥的,還是免了吧。。。全局變量么,能用就用吧。因為如果全局就占一個存儲空間,分散了之后沒準就需要幾個。劃不來。變量名字也往短了起,計算上的東西就已經很頭大了,再搞一堆長長的名字真是打擾心情。還有中斷,才知道多么珍貴,要嚴格控制不要兩個同時進來,而且中斷函數不能重入。。。反正,具體應用很關鍵。不能形而上學。。。
控制全局變量的總量,太多了要出麻煩

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

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

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




歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 亚洲高清在线观看 | 中文字幕亚洲视频 | 暖暖日本在线视频 | 日韩一级欧美一级 | 日本人做爰大片免费观看一老师 | 欧美日韩国产一区二区 | 日韩av一区二区在线 | 97国产一区二区精品久久呦 | 久久国产精品99久久久大便 | 亚洲视频在线观看 | 午夜男人天堂 | 精品网 | 免费观看黄色片视频 | 婷婷在线免费 | 精品久久久av | 亚洲欧美视频一区 | 成人美女免费网站视频 | 日本超碰| 国产成人精品综合 | 第一色在线 | 亚洲欧洲一区 | 欧美99| 中文字幕 在线观看 | 美女爽到呻吟久久久久 | www.黄色网| 伊人网在线播放 | 超碰av在线| 黄a免费网络 | 亚洲精品日韩综合观看成人91 | 亚洲视频一 | 欧美国产91 | 日本在线中文 | 亚洲精品国产第一综合99久久 | 美女黄网站视频免费 | 国产一区亚洲 | 午夜合集 | 精品欧美一区二区三区久久久 | 久色视频在线 | 亚洲国产成人精品女人久久久 | 久久久久国产精品一区 | 欧美电影免费网站 |