新聞中心
存儲(chǔ)類型修飾符可以修改標(biāo)識(shí)符的鏈接和對(duì)應(yīng)對(duì)象的生存周期;標(biāo)識(shí)符有鏈接,而非生命周期;對(duì)象有生存周期,而非鏈接;函數(shù)標(biāo)識(shí)符只可用static、extern修飾,函數(shù)參數(shù)只可用register修飾。

一、標(biāo)識(shí)符的鏈接(linkage)
(1)外部鏈接
表示在整個(gè)程序中(多個(gè)程序文件)是相同的函數(shù)或?qū)ο?。常見的有,在函?shù)體外聲明的extern變量。
(2)內(nèi)部鏈接
表示只在當(dāng)前程序文件中是相同的函數(shù)或?qū)ο?。其它程序文件不能?duì)其進(jìn)行訪問(wèn)。常見的有,在函數(shù)體外聲明的static變量。
(3)無(wú)鏈接
一般聲明在函數(shù)內(nèi)部的auto、register變量、還有函數(shù)的參數(shù),都是無(wú)鏈接。它的作用域是函數(shù)內(nèi)部。
二、對(duì)象的生存周期(lifetime)
(1)靜態(tài)生存周期
具有靜態(tài)生存周期的所有對(duì)象,都是在程序開始執(zhí)行之前就被事先創(chuàng)建和初始化。它們的壽命覆蓋整個(gè)程序的執(zhí)行過(guò)程。如在函數(shù)內(nèi)定義了一個(gè)static變量,那第一次調(diào)用該函數(shù)后,該變量的值將會(huì)被保留,當(dāng)?shù)诙伪徽{(diào)用時(shí),該變量的值還是第一次調(diào)用結(jié)束時(shí)的值。
(2)自動(dòng)生存周期
自動(dòng)生存周期的對(duì)象的壽命由“對(duì)象定義所處在的大括號(hào){}”決定。每次程序執(zhí)行流進(jìn)入一個(gè)語(yǔ)句塊,此語(yǔ)句塊自動(dòng)生存周期的對(duì)象就會(huì)被創(chuàng)建一個(gè)新實(shí)例,同時(shí)被初始化。
三、存儲(chǔ)類修飾符
(1)auto
auto修飾符只能用在函數(shù)內(nèi)的對(duì)象聲明。聲明中有auto修飾符的對(duì)象具有自動(dòng)生存周期。
在ANSI C中,函數(shù)內(nèi)的對(duì)象聲明在默認(rèn)情況下有自動(dòng)生存周期,所以在函數(shù)內(nèi)聲明時(shí)auto可省略。
(2)register
當(dāng)聲明對(duì)象有自動(dòng)生存周期時(shí),可以使用register修飾符。因此,register也只能用在函數(shù)內(nèi)的聲明中。
此關(guān)鍵字告訴編譯器:此對(duì)象的存取應(yīng)該盡量快,最好存儲(chǔ)在CPU的寄存器中。然而,編譯器不見得會(huì)這么做。
另外要注意的是,當(dāng)一個(gè)對(duì)象聲明為register,就不可使用地址運(yùn)算符&了,因?yàn)樗锌赡鼙环诺郊拇嫫髦小?/p>
(3)static
函數(shù)標(biāo)識(shí)符如果被聲明為static,就具有靜態(tài)生命周期。如果是定義在函數(shù)外,那么該對(duì)象具有內(nèi)部鏈接,其它程序文件不能對(duì)其訪問(wèn)。如果是定義在函數(shù)內(nèi),那么該對(duì)象具有無(wú)鏈接,函數(shù)外不能對(duì)其訪問(wèn)。
注意:static變量初始化時(shí),只能用常量。
(4)extern
如果聲明在函數(shù)外,那么該對(duì)象具有外部鏈接,能夠在其它程序文件使用。但要注意它有可能會(huì)被函數(shù)內(nèi)定義的重名的變量所隱藏起來(lái)。
如果聲明在函數(shù)內(nèi),該對(duì)象具有何種鏈接取決于當(dāng)前程序文件中定義在函數(shù)外的相同名字的對(duì)象。如果在函數(shù)外也定義了一下相同名字的static對(duì)象,則該函數(shù)內(nèi)的對(duì)象具有無(wú)鏈接,否則具有外部鏈接。
extern的對(duì)象都具有靜態(tài)生命周期。
使用extern時(shí),注意不能重復(fù)定義,否則編譯報(bào)錯(cuò),如:
程序文件一:
- extern int a = 10; //編譯警告,extern的變量最好不要初始化
程序文件二:
- extern int a = 20; //重復(fù)定義,應(yīng)改為extern int a;
一般最好這樣,如果需要初始化,可把extern修飾符去掉(但也不要重復(fù)定義),另外如果其它程序文件也需要用到該變量,可用extern來(lái)聲明該變量。這樣會(huì)比較清晰。
(5)缺省修飾符
函數(shù)內(nèi),與auto相同;函數(shù)外,與extern相同。
例子:
- int func1(void); //func1具有外部鏈接;
- int a = 10; //a具有外部鏈接,靜態(tài)生存周期;
- extern int b = 1; //b具有外部鏈接,靜態(tài)生存周期。但編譯會(huì)有警告extern變量不應(yīng)初始化,同時(shí)也要注意是否會(huì)重復(fù)定義;
- static int c; //c具有內(nèi)部鏈接,靜態(tài)生存周期;
- static int e; //e具有內(nèi)部鏈接,靜態(tài)生存周期;
- static void func2(int d){ //func2具有內(nèi)部鏈接;參數(shù)d具有無(wú)鏈接,自動(dòng)生存周期;
- extern int a; //a與上面的a一樣(同一變量),具有外部鏈接,靜態(tài)生存周期。注意這里的不會(huì)被默認(rèn)初始為0,它只是個(gè)聲明;
- int b = 2; //b具有無(wú)鏈接,自動(dòng)生存同期。并且將上面聲明的b隱藏起來(lái);
- extern int c; //c與上面的c一樣,維持內(nèi)部鏈接,靜態(tài)生存周期。注意這里的不會(huì)被默認(rèn)初始為0,它只是個(gè)聲明;
- //如果去掉了extern修飾符,就跟b類似了,無(wú)鏈接,自動(dòng)生存周期,把上面聲明的c隱藏起來(lái);
- static int e; //e具有無(wú)鏈接,靜態(tài)生存周期。并且將上面聲明的e隱藏起來(lái);初始化值為0;
- static int f; //f具有無(wú)鏈接,靜態(tài)生存周期;
- }
【編輯推薦】
- 淺談C/C++中的順序點(diǎn)和副作用
- C++連接mysql數(shù)據(jù)庫(kù)的兩種方法
- C++中的指針用法匯集
- C++ Virtual詳解
網(wǎng)頁(yè)標(biāo)題:auto、register、static、extern等存儲(chǔ)類修飾符的區(qū)別
當(dāng)前路徑:http://www.dlmjj.cn/article/cdesjes.html


咨詢
建站咨詢
