修飾符:
(1)auto
auto修飾符只能用在函式內的物件宣告。宣告中有auto修飾符的物件具有自動生存週期。
在ansi c中,函式內的物件宣告在預設情況下有自動生存週期,所以在函式內宣告時auto可省略。
(2)register
當宣告物件有自動生存週期時,可以使用register修飾符。因此,register也只能用在函式內的宣告中。
此關鍵字告訴編譯器:此物件的訪問應該盡量快,最好儲存在cpu的暫存器中。然而,編譯器不見得會這麼做。
另外要注意的是,當乙個物件宣告為register,就不可使用位址運算子&了,因為它有可能被放到暫存器中。
(3)static
函式識別符號如果被宣告為static,就具有靜態生命週期。
如果是定義在函式外,那麼該物件具有內部鏈結,其它程式檔案不能對其訪問。
如果是定義在函式內,那麼該物件具有無鏈結,函式外不能對其訪問。
注意:static變數初始化時,只能用常量。
(4)extern
如果宣告在函式外,那麼該物件具有外部鏈結,能夠在其它程式檔案使用。但要注意它有可能會被函式內定義的重名的變數所隱藏起來。
如果宣告在函式內,該物件具有何種鏈結取決於當前程式檔案中定義在函式外的相同名字的物件。如果在函式外也定義了一下相同名字的static物件,則該函式內的物件具有無鏈結,否則具有外部鏈結。
extern的物件都具有靜態生命週期。
使用extern時,注意不能重複定義,否則編譯報錯,如:
程式檔案一:
extern int a = 10; //編譯警告,extern的變數最好不要初始化
程式檔案二:
extern int a = 20; //重複定義,應改為extern int a;
一般最好這樣,如果需要初始化,可把extern修飾符去掉(但也不要重複定義),另外如果其它程式檔案也需要用到該變數,可用extern來宣告該變數。這樣會比較清晰。
(5)缺
省修飾符
函式內,與auto相同;
函式外,與extern相同;
linkage
lifetime
auto
函式內no linkage 自動
函式外語法錯
語法錯register
函式內no linkage 自動
函式外語法錯
語法錯 預設
函式內no linkage 自動
函式外external linkage 靜態
static
函式內no linkage 靜態
函式外internal linkage 靜態
extern
函式內與它在函式外所宣告的一致 靜態
函式外external linkage 靜態
(1)外部鏈結
表示在整個程式中(多個程式檔案)是相同的函式或物件。常見的有,在函式體外宣告的extern變數。
(2)內部鏈結
表示只在當前程式檔案中是相同的函式或物件。其它程式檔案不能對其進行訪問。常見的有,在函式體外宣告的static變數。
(3)無鏈結
一般宣告在函式內部的auto、register變數、還有函式的引數,都是無鏈結。它的作用域是函式內部。
生存週期:
(1)靜態生存週期
具有靜態生存週期的所有物件,都是在程式開始執行之前就被事先建立和初始化。它們的壽命覆蓋整個程式的執行過程。如在函式內定義了乙個static變數,那第一次呼叫該函式後,該變數的值將會被保留,當第二次被呼叫時,該變數的值還是第一次呼叫結束時的值。
(2)自動生存週期
自動生存週期的物件的壽命由「物件定義所處在的大括號{}」決定。每次程式執行流進入乙個語句塊,此語句塊自動生存週期的物件就會被建立乙個新例項,同時被初始化。
總結:還有很多的擴充套件有待於進一步加上去
擴充套件總結1:修改變數的儲存型別並不表示修改變數的作用域,它仍然只能在該**塊內按名字訪問。
是不是看到這句話人就暈了,是啊,我也暈了。
舉個例子,大家和我都不暈了
在乙個函式內,給乙個變數好比int a 前邊加上關鍵字static,可以使它的儲存型別從auto變成static,具有靜態儲存型別的a在函式執行完畢後還一直存在,但是這個
變數a還是只能在這個函式內部訪問,外部的函式還是不能訪問這個a
擴充套件總結2:函式的形式引數不能宣告為static,因為實參總是在堆疊中傳遞給函式,用於支援遞迴。在棧中的資料,用完後,棧就pop出。
C 語言中的修飾符集錦
修飾符是用於限定型別以及型別成員的申明的一種符號。下面主要從c 中的訪問修飾符,作用於類和結構的修飾符,用在方法或變數的修飾符和特殊作用的修飾符四種,來給大家介紹。1.訪問修飾符 指定宣告的型別和型別成員的可訪問性。1 public 是型別和型別成員的訪問修飾符。公共訪問是允許的最高訪問級別。對訪問...
C語言tips static 修飾符 生命的魔法棒
static 英 st t k 美 st t k adj.靜止的 靜態的 停滯的 靜力的 n.天電 干擾 靜電 靜力學 就像它的本意,static作為c語言關鍵字,主要的作用就是凍結區域性變數。區域性變數在函式完成使命消亡後,繼續存在,延長生命週期,下次繼續呼叫。void static test i...
C 語言中的修飾符大總結
注 本文參考了網上的一些資料,但作者不可考,特向該作者表示感謝。1.訪問修飾符 指定宣告的型別和型別成員的可訪問性。1 public 是型別和型別成員的訪問修飾符。公共訪問是允許的最高訪問級別。對訪問公共成員沒有限制。2 private 是乙個成員訪問修飾符。私有訪問是允許的最低訪問級別。私有成員只...