變量 常量 ?宏 原文鏈接:http://www.lxweimin.com/p/f83335e036b5
首先,extern和static完全不同,extern不能定義一個變量,extern表示的是“已經(jīng)存在一個變量,但是不在當前的編譯單元內(nèi),需要在其他編譯單元中尋找。”static會定義一個變量,但是分成多種情況。
static 修飾局部變量:延長布局變量的生命周期
static 修飾全局變量:當前變量只能在當前文件中使用
static 修飾函數(shù):? 函數(shù)只能在當前文件中使用
---------------------------------------------------------------------
先說extern 和 變量的關(guān)系。
先說只有一個文件(編譯單元)的:
int i=10; //這個是定義一個全局變量,值為10
extern int i=10;? //這個是錯誤的,變量已經(jīng)存在,怎么賦初值呢?
extern int i; //這個和第一句 int i=10; 可以同時存在在一個文件中。
再說跨文件(多個編譯單元)的:
文件一:(假設(shè)這個文件沒有錯誤!!)
int a=10;
文件二:
extern int a; // 這個正確
extern float a; // 這個編譯不會錯,賦值會怎樣呢?
extern int b; //這個找不到
int a=9; //這個出錯,全局變量多次定義
int a; //同上
static int a=9; //這個正確,這個產(chǎn)生一個僅在文件二中有效的全局變量a,初值為9,注意在文件二中將看不到那個值為10的全局變量!!!!
static就是剛才說的最后一種,此外就是函數(shù)內(nèi)的使用了,不再多說了。
特別的,這樣是錯誤的:
a.c:
static int x=10;
b.c:
extern int x; //因為x只在a.c中,b.c中根本看不到x,所以這個extern還是找不到x,因此會在鏈接時報錯。
其他:extern盡量寫到.h文件中,寫到.c里就是錯誤的種子,以后它只能得到苦果!