1. 程式人生 > >作業系統和編譯器如何識別全域性變數和區域性變數

作業系統和編譯器如何識別全域性變數和區域性變數

 作業系統,只管排程程序,執行緒編譯器 根據程式語言的定義,確定變數的作用於,儲存型別,生命週期!
 定義在函式外部的變數,只有檔案靜態變數,和外部變數
 外部變數,是實實在在的全域性變數,不論作用域還是生命週期。
 
 靜態變數是區域性作用域的,生命週期為,程式的生命週期的變數。
 自動變數和函式引數,是區域性作用域的生命週期為函式結束的區域性變數。
 
 暫存器變數,用register定義, 是區域性變數;
 函式內部的 靜態變數 ,語句組內部的靜態變數,區域性作用域的,生命週期為,程式的生命週期的變數。
 
 靜態變數,編譯器 ,可以通過 static 關鍵字知道。
 
 自動變數,1)函式內部定義的非靜態變數,非暫存器變數是自動變數。
          2)函式引數,只能是自動變數,不過也可能定義在暫存器中。
              這和呼叫約定有關,因此不可以用register定義。
 
 C語言沒有全域性變數這種資料型別。
 只有4種儲存型別,和變數的作用域與生命週期的概念。
 C++ 同樣沒有全域性變數這種資料型別。
 有另外的兩種作用域
 1) namespace 作用域。
 2) 類(型別)作用域。
 C只有 全域性,檔案,函式以及函式內部的語句組,4種逐漸縮小的作用域。
 其中內層,對外部作用域,具有完全的遮蔽作用。
 C++ 可以通過作用域限定符,區分不同作用域(類,名空間)的名字。
 類作用域,可以通過訪問許可權,限制外部的訪問權。
 
 函式作用域(語句組作用域)是封閉的作用域,外部不可以使用函式內部定義的名字。
 也不會和外部有命名衝突,只會遮蔽外部的名字。
 
 類作用於,和名空間由於訪問方式不同,命名衝突和遮蔽有些特殊。
 
 函式和全域性域,基本不會和類作用域有命名衝突,除非類方法內部。
 
 名稱空間,可以避免命名衝突。
 
 類繼承體系中,則有遮蔽現象。
 還有訪問許可權問題。
 
 實際上,全域性變數,有兩個概念可以判定
 1)作用域(空間)   ===>由定義和宣告位置,和定義和宣告使用的關鍵字決定。
 2)生命週期(時間) ===>外部和靜態變數,的生命週期是全域性的,從初始化到程式結束。
 函式引數,和函式區域性非靜態變數,是區域性變數
 函式引數的傳遞,是跨函式的(實參,變成形參);
 
 函式內部定義的,區域性變數,只有定義處可見,作用域是函式甚至語句組區域性,
 其中靜態變數,生命週期是全域性的,非靜態是函式甚至語句組的。
 
全域性變數,不是C,C++的概念。
 
而是,使用程式語言的程式設計師的概念。
 
所以,全域性變數 和C,C++的儲存型別,作用域,生命週期等,不是一一對應的概念。
所以,可以有不同的理解。
 
所以這個概念是很模糊的,不清晰的。
 
比如區域性靜態變數,類的靜態變數,是否全域性變數,就不是可以清晰的說明的。