備註:1.鏈接屬性分爲external,internal,none。
2.全局變量默認擁有external鏈接屬性;
static修飾的變量擁有internal鏈接屬性;
函數體中的變量用於none鏈接屬性。
3.擁有external鏈接屬性的變量可被所有文件訪問,只需要聲明下即可(extern int b;)
擁有internal屬性的變量只能在其定義的文件中被訪問(static int sta_c;)
擁有none屬性的變量只能在其定義開始處到代碼塊作用域結束處被訪問。
4.給已經定義的變量添加任何鏈接屬性聲明(如:extern或static)都是無效的,變量原鏈接屬性保持不變。
用代碼說明:
--------------------------------myfun.c文件-------------------------------------------------------------
int b = 123; ①
int out_c = 315;
static double PI= 3.14159; //myfun.c文件以外的文件是不能訪問PI變量的
int Add()
{
}
--------------------------------------------------------------------------------------------------------------
-------------------------------test.c 文件----------------------------------------------------------------
#include ..
int b;② //等價於extern int b;即定義在myfun.c中的變量b,最好寫成extern int b;易於理解,這種簡寫模式只適用於全局作用域,對於函數作用域是不能簡寫的,否則成了定義函數的局部變量。
int main(void)
{
extern int b;③ //external(外部鏈接)屬性的b,其作用域起於此聲明處止於語句④之前
printf("%d\n",b); //輸出:123
//函數的局部變量,鏈接屬性爲none;④處的變量b會屏蔽掉③處的變量b,
int b = 456; ④
//④處變量b的作用域起於其定義處,止於函數結束
printf("%d",b); //輸出: 456
extern int b;⑤
//編譯器將extern int b解析成:在已經定義的int b = 456 (④)基礎
//上加了一個extern屬性。C規定:在已經定義變量上加任何鏈接屬性都不
//會改變變量的原鏈接屬性。給b上加extern屬性並不會使none鏈接屬性變成extern鏈接屬性。
printf("%d",b); //所以輸出: 456
extern int out_c;//絕對不能簡寫成int out_c;否則是定義函數作用域的變量
printf("%d",out_c); //輸出:315
return 0;
}