作用域 鏈結屬性 儲存時期 儲存型別內容請先參考博文c語言有5中儲存型別修飾符:
auto
register
static
extern
typedef
下面分別介紹各說明符的用法:
extern
: 表明識別符號具有外部鏈結屬性或者該變數在別處定義
想要理解extern的用法首先要理解c語言的宣告與定義的區別:
宣告:描述程式其他地方定義的物件
定義:為物件分配記憶體
如果下列語句出現在所有函式體之外
// main.c
#include
extern
int i; // i的extern宣告
int main(void)
// main.c
#include
extern
int i; // i的extern宣告
int main(void)
// define.c
int i = 1; // i在另乙個編譯單元定義
如果下列語句出現在函式體內
// program 1
// main.c
#include
int main(void)
program 1編譯通過..
// program 2
// main.c
#include
int main(void)
program 2在win7+vs2015平台下報錯:error lnk2001: 無法解析的外部符號 _i
// program 3
// main.c
#include
int main(void)
program 3在win7+vs2015平台下報錯:error c2065: 「i」: 未宣告的識別符號
// program 4
// main.c
#include
int i = 1;
int main(void)
program 4編譯成功, 列印出1.
// program 5
// main.c
#include
int main(void)
program 5在win7+vs2015下報錯error c2086: 「int i」: 重定義
// program 6
// main.c
#include
int main(void)
program 6在win7+vs2015下報錯error c2086: 「int i」: 重定義
// program 7
// main.c
#include
int main(void)
// define.c
int i = 1;
program 7編譯通過, 列印出1.
綜合上面例子可以猜想:
編譯程式時首先判斷i是否定義(存在記憶體), 若是未定義則將extern int i;
當作對i的extern宣告; 若是存在i的定義, 則再判斷i的鏈結性, 若是外部鏈結則extern int i;
作為i的extern宣告, 若是i為無鏈結屬性, 則extern int i
作為對i的定義, 並且使用extern強制i為外部鏈結屬性(由於未賦初始值所以不會產生無法在函式內部初始化外部變數的報錯), 這樣就會有兩個i的定義, 所以報錯重複定義.
以上關於extern的用法只是個人猜想關於儲存類說明符有以下幾點要說明:
C語言 儲存類說明符
一 儲存類有關c語言的儲存類,推薦的參考資料 c primer plus,其中有一章專門講解這個 在理解c的儲存類之前,首先要搞懂的概念有 作用域 生存週期 連線屬性c中的儲存類說明符實際上是上述屬性的不同組合 作用域 乙個c變數的作用域可以是 塊作用域 在函式內部 塊中定義的變數 形參,稱為 區域...
c語言中儲存類說明符的理解
auto 用於 塊作用區域的變數宣告 就是最一般情況下的變數宣告,register 僅用於 塊作用區域的變數,請求指令,請求該變數儲存在乙個暫存器中 static 用於 塊作用的區域時 該變數具有靜態儲存時期,相當於在整個程式執行中一直存在。用於檔案作用域時,該變數具有內部鏈結,則改變量在該檔案中可...
C語言轉換說明符
格式轉換說明符printf scanf 本文 表一 轉換說明符及作為結果的列印輸出 轉換說明 輸 出 a 浮點數 十六進製制數字和p 記數法 c99 a浮點數 十六進製制數字和p 記數法 c99 c乙個字元 d 有符號十進位制整數 e 浮點數 e 記數法 e 浮點數 e 記數法 f 浮點數,十進位制...