變數在程式的某個部分宣告時,只能在程式的一定區域內才能訪問,這個區域就成為作用域。作用域分為四種——檔案作用域、函式作用域、**塊作用域和原型作用域。編譯器通過變數宣告的位置來確定作用域
當變數在所有**塊之外宣告時就在檔案作用域中,檔案作用域的範圍是從變數宣告處一直到檔案的結束。但如果宣告在「.h」檔案中,並且該檔案被其他檔案用#include 所包含,那該變數的作用域也會相應的擴大到包含檔案的結束。
函式作用域只適用於語句標籤,語句標籤用於goto語句。乙個函式作用域內的語句標籤必須唯一。
一對花括號之間的所有語句成為**塊作用域。在乙個**塊作用域開始定義的變數可以被該**塊內的所有語句使用。
下面考慮兩種情況:
**塊之間的巢狀
}
此時內層的a就會把外層的a隱藏,如果修改內層a的值,不會影響外層的a
非巢狀的兩個**塊
如果兩個**塊之間沒有交集,那麼乙個**塊的內的就語句不能使用另乙個**塊內的變數。
原型作用域適用於在函式宣告中的引數名。
鏈結屬性決定如何處理位於不同檔案內的識別符號。鏈結屬性共有三種——external(外部)、internal(內部)、none(無)。
如果使用externa關鍵字宣告某乙個變數,說明該變數在別的地方定義的,可能位於別的檔案也可能位於當前檔案。該關鍵字制定識別符號的鏈結屬性為external
如果乙個識別符號的鏈結屬性為external,那麼static可以將其鏈結屬性改為internal
實驗1
int a = 100;
void printfa1()
int a = 20;
void printfa2()
#include
#include
void printfa1();
void printfa2();
int main()
編譯器報錯:multiple definition of `a』
結論:在不同檔案中不能包含同名的識別符號
實驗2
給test2.c中的a加上extern識別符號
不變
extern
int a;
void printfa2()
#include
#include
void printfa1();
void printfa2();
int main()
編譯通過,成功輸出100 和 10,說明3個a都是以乙個變數
結論:通過extern關鍵字可以訪問由別的檔案定義的變數
注:不能使用extern修飾變數的同時給該變數賦初值,這樣編譯器也會報錯
error: 『xx』 has both 『extern』 and initializer
原因是因為該變數實在別的地方定義的所以不能給他賦初值。
實驗3
給test1.c中的a用static修飾,其他檔案不變,編譯無法通過,說明用static修飾的變數只能用於宣告的檔案中,繼續修改test1.c、test2.c和main.c
static
int a = 100;
void printfa1()
int a = 9;
void printfa2()
#include
#include
void printfa1();
void printfa2();
int main()
輸出為100 9 100 10
說明由static修飾的變數既不能被外部訪問也不能使用外部檔案的同名變數
實驗4
修改test1.c中的printfa1函式,用static修飾
static
int a = 100;
static
void printfa1()
編譯出錯,main函式中的printfa1中未定義,說明該函式只能在定義的檔案中使用
儲存型別分為普通記憶體,執行時記憶體和硬體暫存器
當static用於**塊之外時,static用於修改識別符號的鏈結屬性,從external修改為static
當static用與**塊內部時,static用於修改識別符號的儲存型別,將其從自動變數修改為靜態變數
鏈結屬性和儲存型別
全域性變數和函式具有external鏈結屬性,其餘識別符號的鏈結屬性則為none。static關鍵字可以使鏈結屬性變為internal,而且static只對預設鏈結屬性為external的宣告才有改變鏈結屬性的效果。有三個地方可以用於儲存變數 普通記憶體 執行時堆疊 硬體暫存器。變數的預設儲存型別取...
(C ) 作用域和鏈結
作用域 描述了名稱在檔案 翻譯單元 的多大範圍內可見。例如 在function hello 中有個變數x,這個變數的作用域只在該函式範圍內有效。鏈結性為外部的可在檔案間共享,鏈結性為內部的名稱只能由乙個檔案中的函式共享。ps 自動變數的名稱沒有鏈結性,所以他們不能共享。變數的宣告週期的計算為 如果該...
作用域與鏈結屬性
december 6,2015 11 23 am 1.作用域檔案作用域 從申明位置開始到問價結束 原型作用域 從申明開始到結束,僅限於申明處,主要用於防止引數重名 塊作用域 位於一對花括號之內,從申明開始到右花括號 函式作用域 只有語句標號屬於函式作用域,不需要先申明再使用,乙個函式所有語句標籤唯一...