C 作用域 鏈結屬性和儲存型別

2021-07-09 13:18:33 字數 2247 閱讀 8792

變數在程式的某個部分宣告時,只能在程式的一定區域內才能訪問,這個區域就成為作用域。作用域分為四種——檔案作用域、函式作用域、**塊作用域和原型作用域。編譯器通過變數宣告的位置來確定作用域

當變數在所有**塊之外宣告時就在檔案作用域中,檔案作用域的範圍是從變數宣告處一直到檔案的結束。但如果宣告在「.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.作用域檔案作用域 從申明位置開始到問價結束 原型作用域 從申明開始到結束,僅限於申明處,主要用於防止引數重名 塊作用域 位於一對花括號之內,從申明開始到右花括號 函式作用域 只有語句標號屬於函式作用域,不需要先申明再使用,乙個函式所有語句標籤唯一...