被static修飾的內容表示連線性為內部,即static的函式或變數只會在當前翻譯單元內部使用,具有內部連線性的名字在編譯時就會生成,不需要等到鏈結時或是執行時,與之相對的是連線為外部的變數和函式(static的反義詞可以認為是extern),由於具有外部連線性的名字可能會被多個檔案共享使用,根據「單一定義規則odr」,我們應當保證他們不能重名(函式名和變數名相同也算重名,因為在聯結器眼中他們都是強符號),如果重名了,聯結器在「符號解析」階段報錯。
需要注意的是通常在函式中定義的非static區域性變數是在執行時棧幀上維護的,但static區域性變數不是在棧幀上維護的,他們在編譯時就確定了,不會等到執行時。
在「**段」中又包含了3個節(section)「.data」表示**段,「.rodata」唯讀資料段如c++中const變數,「.init」包含初始化資訊;「資料段」中2個節「.data」表示已初始化的全域性變數和static變數,「.bss」表示沒有初始的全域性變數和static變數以及初始化為0的全域性變數和是static變數,這個節中得資料不會占用磁碟空間,在程式載入時作業系統統一填充零,需要注意的是在c語言中,目標檔案(.o)中的沒有初始化的全域性變數是放在乙個「偽節common」中,因此可以在不同檔案中定義多個同名的未初始化全域性變數,在鏈結時鏈結器會隨機挑選乙個,這種特性可能會帶來潛在的隱患,可以通過選項「-fno-common」,來關閉它。
知道了以上這些內幕,應該就能理解為什麼static變數和其他變數不相同。
回到c++中static變數,類中宣告的static成員變數和成員函式,是類物件共享的,它不依附某乙個物件,可以直接通過「classname::」呼叫,當然也可以通過「物件::」呼叫,它的初始化要在類外進行,需要加上"classname::",但不能加上「static」;static成員函式不能呼叫非static成員函式,因為static成員函式沒有隱式的「this」指標,但是非static成員函式有「this」指標;const也不能放在函式最後來修飾static成員函式,原因也是因為static函式沒有「this」指標。
C C 中static關鍵字作用總結
1.先來介紹它的第一條也是最重要的一條 隱藏。static函式,static變數均可 當同時編譯多個檔案時,所有未加static字首的全域性變數和函式都具有全域性可見性。舉例來說明。同時編譯兩個原始檔,乙個是a.c,另乙個是main.c。a.cchar a a global variable voi...
c c 中static關鍵字的總結
1 改變了變數的儲存方式 從棧區變成全域性區 即改變了變數的生命週期。2 static 區域性變數只初始化一次,沒有顯示初始化時預設為 01 全域性變數前面加上static 儲存方式沒有改變。2 static全域性變數改變了作用域,限制了使用範圍,只能在定義了該變數的原始檔有效,在同一源程式的不同原...
C C 中static關鍵字作用總結
原文 1.先來介紹它的第一條也是最重要的一條 隱藏。static函式,static變數均可 當同時編譯多個檔案時,所有未加 static字首的全域性變數和函式都具有全域性可見性。舉例來說明。同時編譯兩個原始檔,乙個是a.c,另乙個是main.c。a.cchar a a global variable...