C語言變量的初始化


1. 全局變量的初始化

     對於不同編譯單位的全局變量,其初始化的順序沒有任何的保證,因此對不同編譯單位里的全局變量,在它們的初始化順序之間建立依賴性都是不明智的。

     此外也沒辦法捕捉到全局變量初始化拋出的異常,一般來說要減少全局變量的使用,特別是限制那些要求復雜初始化的全局變量。
     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總是能夠返回正確的結果,原因在於,函數內部的靜態變量是在第一次訪問的時候來初始化。
    任何時候,如果在不同的被編譯單元中定義了"非局部靜態對象",並且這些對象的正確行為依賴於它們被初始化的某一特定順序,就會產生問題.你絕對無法控制不同被編譯單元中非局部靜態對象的初始化順序.對於函數中的靜態對象(即"局部"靜態對象)它們在函數調用過程中初次碰到對象的定義時被初始化..  
     注意:千萬不要寫出和編譯順序相關的程序來。
 
關於全局變量的初始化,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++中全局對象、變量的構造函數調用順序是跟聲明有一定關系的,即在同一個文件中先聲明的先調用。對於不同文件中的全局對象、變量,它們的構造函數調用順序是未定義的,取決於具體的編譯器。
---------------------------------------------------------------------------------------------------------------------------
另:
   c語言中 支持 結構體間的整體附值。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM