1. 程式人生 > >const、static、內部連結屬性和外部連結屬性整理

const、static、內部連結屬性和外部連結屬性整理

開發十年,就只剩下這套架構體系了! >>>   

c語言中,多個檔案組合的時候,有可能標示名相同,那麼這個時候編譯器如何判別的呢?
    c語言中有3種連結屬性: 外部(external), 內部(internal),無設定(none)
    外部(external): 使用extern關鍵字
    內部(internal):  使用static關鍵字
   

小結一下:

1.extern的修飾中在工程必須要有一個變數的定義,否則不能能使用。

2.extern使用之後可是實現全部工程的不同檔案使用相同的變數

3.internal的屬性方式,通過static來進行修飾僅僅是在改檔案中可以使用,但是在其他的檔案中則不能訪問。

 

 


    對各種情況進行一些測試吧
 第一步測試,在兩個檔案中定義相同名稱的變數
    unit1.c
    --------------------
int a = 10;
void printtest1()
{
 printf("print test at %s, variable a = %d/n", __FILE__, a);
}

    unit2.c
 -------------------
int a = 20;
void printtest2()
{
 printf("print test at %s, variable a = %d/n", __FILE__, a);
}

    main.c
 ------------------
void printtest1();
void printtest1();
int main(int argc, char *argv[])
{
 printtest1();
 printtest2();
 system("PAUSE"); 
 return 0;
}
   編譯時提示錯誤 unit2.c multiple definition of 'a' ,由於unit1.c和unit2.c都定義了a
   第一步測試結論:如果在不同的檔案中定義相同名字的變數,編譯器無法通過編譯
   
   第二步測試,把其中一個宣告改成extern 
   這個時候把unit2.c改造一下
extern int a;
void printtest2()
{
 printf("print test at %s, variable a = %d/n", __FILE__, a);
}
   unit2中使用extern標示該變數是外部連結的, 這樣編譯通過了,結果顯示unit1和unit2中a的值都為10,OK,值相同了,那麼真的是同一個變量了嗎,修改一下值再確認一下
   改造一下main.c,修改a的值
extern int a;
a = 20;
printtest1();
printtest2();
a = 30;
printtest1();
printtest2();
 這個時候輸出為
 unit1.c   20
 unit2.c   20
 unit1.c   30
 unit2.c   30
 可以確認的確是使用了同一個變量了。
 第二步測試結論;使用extern可以訪問其他檔案中定義的變數
 
 第三步測試把其中一個宣告使用static標示
 首先在unit1.c這把a宣告成static,個時候編譯器提示main.c和unit2.c中的a未定義,static把unit1.c中的a定義為檔案內部使用範圍,unit2.c和main.c中無法訪問到該變數。
 把uint2.c中的宣告修改成int a;
 這個時候輸出為
 unit1.c   10
 unit2.c   20
 unit1.c   10
 unit2.c   30
    OK,結果顯示unit1.c中的a和unit2.c中的a互相不影響了。再測試一下,在unit1.c中使用extern int a,看看能不能引用到unit2.c中的變數
void printtest1()
{
 extern int a;
 a = 10;
 printf("print test at %s, variable a = %d/n", __FILE__, a);
}
    這個時候輸出為
 unit1.c   10
 unit2.c   20
 unit1.c   10
 unit2.c   30
    可以確認unit1.c中使用的a都是本檔案內定義的變數,無法影響到unit2.c中的變量了。
 第三步測試結論:使用static標示的變數在檔案內部有效,其他檔案中無法訪問。並且在該檔案中無法引用到其他檔案的同名稱變數
 
 第四步測試,兩個檔案都設定成extern
 如果在unit1.c和unit2.c中都申明成extern會怎麼樣呢?
    unit1.c
    --------------------
extern int a;
void printtest1()
{
 printf("print test at %s, variable a = %d/n", __FILE__, a);
}

    unit2.c
 -------------------
exntern int a;
void printtest2()
{
 printf("print test at %s, variable a = %d/n", __FILE__, a);
}
 這個時候所有使用a的地方都報編譯錯誤,提示沒有定義變數。
 第四步測試結論:使用extern標示的變數必須已經定義過。
 
 第五步,測試static標示的函式
 把unit1.c中的printtest1修改成static
 static void printtest1()
 這時編譯器報錯,main.c中使用的printtest1未定義。
 第5步測試結論:使用static標示的函式,在其他檔