前面講了,static和extern對函式的作用,static用來定義乙個內部函式,不允許其他檔案訪問;
extern用來定義和宣告乙個外部函式,允許其他檔案訪問。
statuc和extern對變數也有作用,不過跟函式有點差別。
1.預設情況下,乙個函式不可以訪問再它後面定義對全域性變數。
int main()
int a;
這樣編譯器直接報錯了。
第一種解決辦法就是,將變數a定義(其實編譯器預設加上extern)再main函式前面;
int a;
int main()
這樣編譯器就不會找你麻煩了。
第二種解決辦法:在main函式前面對變數a進行提前宣告。
也就是讓main函式知道變數a的存在就行了,至於變數a定義在哪個位置,main函式不用管;
extern用於
宣告乙個已經存在(定義)的變數
extern int a;//僅僅宣告
int main()
int a;//進行定義
宣告和定義兩回事。
a=18,操作的是 int a變數;
要是這樣,可以騙過編譯器,不會報錯。
但是執行的時候,會報錯。
因為extern只能宣告乙個已經定義的變數
第三種:
第四種:
如果將區域性變數的extern去掉:
就變成區域性變數了,遇到 } 就會銷毀.
補充:
message.c檔案
如果兩個檔案同時定義乙個全域性變數,實質上指向的是同乙個變數。
注意的時候,兩個檔案之中,可以main宣告 extern a 也可以, message檔案中宣告extern a,但是兩個不檔案不能同時宣告
extern a,否則報錯.
其實在前面的例子中我們已經看到static關鍵字在變數中的使用.
在例子中使用static定了乙個區域性變數,而且我們強調static區域性變數在函式中只被初始化一次,直到程式結束後才銷毀
那麼如果static作用於全域性變數是什麼效果呢?
如果static作用於全域性變數它的作用就是定義乙個只能在當前檔案訪問的全域性變數,相等於私有全域性變數。
根據上面例子:
輸出兩個不同的變數。
總結:1.extern作用於全域性變數時用於宣告乙個已經定義的變數,但是並不能定義變數;
使用extern你可以在其他檔案中使用全域性變數(當然此時extern可以省略);
2.static作用於區域性變數時,該變數只會定義一次,以後在使用時不會重新定義。
當static作用於全域性變數時說明該變數只能在當前檔案可以訪問,其他檔案中不能訪問;
C語言儲存方式和作用域 1
只有完全了解每個變數或函式儲存方式 作用範圍和銷毀時間才可能正確的使用程式語言。基礎紮實才是硬道理。在c語言中變數從作用範圍分為 1.全域性變數 定在所有函式外部的定義的變數,定義後所有的函式中均可以使用,只要前面的 修改了,那麼後面的 中再使用就是修改後的值。ps 在專案中,一般有兩到三處,我一般...
C 語言程式設計 作用域和儲存器
所謂作用域 scope 就是變數的有效範圍。c 語言中所有的變數都有自己的作用域,決定變數作用域的是變數的定義位置。注 區域性變數和全域性變數的名稱可以相同,但是在函式內,如果兩個名字相同,會優先使用區域性變數值,全域性變數不會被使用。全域性變數與區域性變數在記憶體中的區別 注 正確地初始化變數是乙...
變數的作用域和儲存方式
按作用域可分為 區域性變數 函式級區域性變數,復合語句級區域性變數,這種型別的變數在本函式或本復合語句內有效,在其他範圍內無效。按儲存方式可分為 靜態儲存區儲存 全域性變數和static區域性變數全部存放在靜態儲存區,從定義開始占用記憶體一直到本檔案結束釋放記憶體,存放在靜態儲存區的區域性變數並不隨...