c语言3种链接属性: 外部(external), 内部(internal),无设置(none)
c語言中,多個文件組合的時候,有可能標(biāo)示名相同,那么這個時候編譯器如何判別的呢?
c語言中有3種鏈接屬性: 外部(external:可以被其他文件訪問到), 內(nèi)部(internal:無法被其他文件訪問到),無設(shè)置(none)
??? 外部(external):使用extern關(guān)鍵字
??? 內(nèi)部(internal?):使用static關(guān)鍵字
???
小結(jié)一下:
1.extern的修飾的符號,必須在工程的其他文件中要有一個變量的定義,否則不能被使用。
2.extern使用之后可是實現(xiàn)全部工程的不同文件使用相同的變量
3.internal的屬性方式,通過static來進(jìn)行修飾僅僅是在改文件中可以使用,但是在其他的文件中則不能訪問。
?對各種情況進(jìn)行一些測試吧
?第一步測試,在兩個文件中定義相同名稱的變量
??? 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
?? 第一步測試結(jié)論:如果在不同的文件中定義相同名字的變量,編譯器無法通過編譯
============================================================================================?
?? 第二步測試,把其中一個聲明改成extern?
?? 這個時候把unit2.c改造一下
extern int a;
void printtest2()
{
?printf("print test at %s, variable a = %d/n", __FILE__, a);
}
?? unit2中使用extern標(biāo)示該變量是外部鏈接的, 這樣編譯通過了,結(jié)果顯示unit1和unit2中a的值都為10,OK,值相同了,那么真的是同一個變量了嗎,修改一下值再確認(rèn)一下
?? 改造一下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
?可以確認(rèn)的確是使用了同一個變量了。
?第二步測試結(jié)論;使用extern可以訪問其他文件中定義的變量
?============================================================================================?
?第三步測試把其中一個聲明使用static標(biāo)示
?首先在unit1.c這把a(bǔ)聲明成static,個時候編譯器提示main.c和unit2.c中的a未定義,static把unit1.c中的a定義為文件內(nèi)部使用范圍,unit2.c和main.c中無法訪問到該變量。
?把uint2.c中的聲明修改成int a;
?這個時候輸出為
?unit1.c?? 10
?unit2.c?? 20
?unit1.c?? 10
?unit2.c?? 30
??? OK,結(jié)果顯示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
??? 可以確認(rèn)unit1.c中使用的a都是本文件內(nèi)定義的變量,無法影響到unit2.c中的變量了。
?第三步測試結(jié)論:使用static標(biāo)示的變量在文件內(nèi)部有效,其他文件中無法訪問。并且在該文件中無法引用到其他文件的同名稱變量
?============================================================================================?
?第四步測試,兩個文件都設(shè)置成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的地方都報編譯錯誤,提示沒有定義變量。
?第四步測試結(jié)論:使用extern標(biāo)示的變量必須已經(jīng)定義過。
?============================================================================================?
?第五步,測試static標(biāo)示的函數(shù)
?把unit1.c中的printtest1修改成static
?static void printtest1()
?這時編譯器報錯,main.c中使用的printtest1未定義。
?第5步測試結(jié)論:使用static標(biāo)示的函數(shù),在其他文件中不能訪問。
?============================================================================================?
?
總結(jié)
以上是生活随笔為你收集整理的c语言3种链接属性: 外部(external), 内部(internal),无设置(none)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 日本GDP创65年来最大萎缩,失去世界第
- 下一篇: 6月份我国减持93亿美债,上半年增减各占