external和internal以及none鏈接屬性的講解

㈠. external和internal以及none鏈接屬性的講解
備註: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;
}
發佈了77 篇原創文章 · 獲贊 110 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章