c語言中,多個文件組合的時候,有可能標示名相同,那麼這個時候編譯器如何判別的呢?
c語言中有3種連接屬性: 外部(external), 內部(internal),無設置(none)
外部(external): 使用extern關鍵字
內部(internal): 使用static關鍵字
函數
小結一下:測試
1.extern的修飾中在工程必需要有一個變量的定義,不然不能能使用。ui
2.extern使用以後但是實現所有工程的不一樣文件使用相同的變量ip
3.internal的屬性方式,經過static來進行修飾僅僅是在改文件中可使用,可是在其餘的文件中則不能訪問。編譯器
對各類狀況進行一些測試吧
第一步測試,在兩個文件中定義相同名稱的變量
unit1.c
--------------------
int a = 10;
void printtest1()
{
printf("print test at %s, variable a = %d/n", __FILE__, a);
}it
unit2.c
-------------------
int a = 20;
void printtest2()
{
printf("print test at %s, variable a = %d/n", __FILE__, a);
}io
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標示的函數,在其餘文件中不能訪問。test