1. 程式人生 > >全域性變數的危險.md

全域性變數的危險.md

全域性變數的危險

​ 對於新手來說,有一點非常諷刺,那就是當我們這些新手認為某些特性很有用而大量使用時,往往那些經驗豐富的程式設計師都會非常謹慎的對待。像是全域性變數,很多新手都非常喜歡(我倒是談不上喜歡或討厭),因為它的作用域是整個原始檔,整個程式的各個部分都可以使用,於是我們就不需要將它們作為引數傳遞給函式。但是,就是因為程式中的各個部分都可以隨意使用它,才使得全域性變數存在很大的風險:假設這種情況,當我們的程式因為一個變數的錯誤賦值而出現問題時,如果是某個函式的區域性變數,我們只需要在該函式的可見域裡面找問題,但是如果是全域性變數呢?那麼問題就可能出現在整個程式中任何地方了。所以,最好的做法就是避免使用全域性變數,如果我們的程式中有一個以上的全域性變數,我們就需要認真斟酌,其中是否有些根本就不需要宣告為全域性變數呢。
這裡又有一個新的疑問,好吧,我可以不使用全域性變數,但是這樣全域性變數還有意義嗎!!當然有,而且意義很大。全域性變數最根本作用就是作為模組函式呼叫間的內部狀態。什麼是內部狀態呢?舉個例子,如果現在我正在寫一個圖形庫,裡面每條線都是從上一條線的結束處開始,那麼我們就必須記錄這個結束處作為內部狀態的一部分。可以這樣認為,內部狀態就是各個函式呼叫間的通訊,當這個狀態因為某個函式而改變時,會使另一個函式呼叫開始發揮作用。區域性變數根本不能作為內部狀態,因為它的作用域只是它所宣告的函式,函式一旦結束,它所儲存的值也就丟失。但是,這時使用全域性變數依然並不代表我們的程式是安全的,全域性變數的危險依然存在。所以,這時我們就要使用static來修飾全域性變數,使它的連結性變為內部。這種情況對於多模組的程式來說尤其重要,因為全域性變數對於這個檔案都是可見的,所以如果沒有static,那麼任何模組都可以使用,而且不能宣告一個重名的變數,但是我們知道,實際開發中,是不同人進行不同模組的開發的,彼此間對於變數名的使用是不知道的,所以名稱衝突是隨時會發生的,尤其是對於同一個問題的開發。使用static,就可以避免這種衝突,因為static全域性變數只對於所宣告的模組是可見的,只可以在所宣告的模組中使用,其他模組無法使用,所以其他模組是可以宣告一個重名的變數的。雖然static在很多程式語言中的意義是說明物件是如何儲存的,但是它的使用意義卻更接近於private。
所以,如果我們使用一個全域性變數,請在前面加上static,這樣就可以避免一些我們不知道的錯誤。