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