extern,static儲存空間矛盾

2021-05-25 17:42:40 字數 861 閱讀 8452

其實,這兩個語句的位置不同,會出現不同的解釋。這主要是由於 static 具有的兩重意義所導致的:

(1) 如果 static int foo; 這一句位於函式中,則 static 表示的是儲存屬性,表明 foo 是乙個靜態變數。

(2) 如果 static int foo; 這一句位於函式外面,則 foo 是乙個全域性變數,static 不再是表示儲存性質,而是作為限制符來使用:用來限制全域性變數 foo 的可見範圍,將其作用域限制於所在的檔案內,在其它檔案中是不可見的。

樓主所說的用編譯器出錯的情況應該是這兩句都位於函式外面的情況。在這種情況下

extern int foo;

static int foo;

先宣告變數的存在,再定義變數。在 extern int foo; 之前還沒有遇到其定義,故 foo 的定義可能出現在這個檔案後面或者在其它檔案中,因此期望 foo 的作用範圍不能僅僅侷限於本檔案,即不能是 static 全域性變數。這就與下面給定的 foo 的定義相矛盾:由於定義語句縮小了被宣告的 foo 的作用範圍(只侷限在本檔案中)從而導致宣告和定義不一致。

出現的先後順序不一樣,出現的編譯資訊也不同。例如,如果是下面的情況

static int foo;

extern int foo;

即先定義後宣告。此時,宣告將遵從定義的規定,繼承定義變數的一切屬性。

從總體上程式的記憶體空間可分為**區和資料區。

從c++的角度來看資料區又可作如下劃分:

1. 自動儲存區(棧):自動(區域性)變數、暫存器變數、臨時物件以及函式引數。

2. 靜態儲存區:全域性物件、函式中的靜態變數、類中的靜態資料成員、常量字串以及 namespace 變數。

3. 自由儲存區(堆):也稱為動態記憶體。

全域性變數,extern,static

宣告函式或全域性變數的作用範圍的關鍵字,其宣告的函式和變數可以在本模組 其他模組中使用。注意 它是乙個宣告不是定義 全域性變數的定義和宣告一般情況下最好分開。預設情況下 全域性變數只能在定義它的檔案中使用 但如果在另乙個檔案中將這個變數宣告為外部變數,那麼這個變數的作用域將被擴充套件到另外乙個檔案中...

函式傳空參 呼叫儲存過程

這個可是折騰了我昨天一下午,我就是喜歡能少寫方法就少寫,所以就會出現很多的問題。不過還是有很多收穫。算了,還是貼 吧,看的實在點。int?companyid convert.toint32 session frame id 這個是aspx.cs檔案定義的引數咯,當session frame id 為...

Oracle PL SQL中編寫空操作的儲存過程

儘管我們編寫儲存過程 stored procedure 是希望其完成一些特定的功能。但是在某些情況下,現有的儲存功能所實現的功能可能已經不再需要或者我們打算採用其它方式來實現,此時為了實現對現有系統的最小改動量 以盡可能的減少對現有系統的影響 我們不能刪除這個儲存過程,但需要修改這個儲存過程使其做空...