宣告中出現的儲存類修飾符(storage class specifier)用於修改識別符號的連結和對應物件的儲存週期(連結與儲存週期的概念將會在本章後面介紹)。
一個宣告中不能出現多個儲存類修飾符。函數識別符號只可以使用儲存類修飾符 extern 或 static。函數引數隻可以使用儲存類修飾符 register。5 種儲存類修飾符的含義如下:
(1) auto
宣告中有修飾符 auto 的物件,具有動態儲存週期。這種修飾符只能用於函數內的物件宣告。在 ANSIC 中,預設情況下函數內的物件宣告都有動態的儲存週期,所以不需要使用修飾符 auto。
(2) register
當宣告物件有動態儲存週期時,可以使用修飾符 register。該關鍵字告訴編譯器,所宣告物件的存取應該盡量快——理想情況下,應該將該物件儲存在 CPU 暫存器(register)中。然而,編譯器可能並不會按照理想情況那樣做,而是會把用 register 宣告的物件當成普通的動態儲存週期物件。不管怎樣,只要採用修飾符 re-gister 宣告了物件,就不能用地址運算子對該物件進行操作。
(3) static
被宣告為 static 的函數識別符號具有內部連結,換句話說,別的翻譯單元無法使用所宣告的函數識別符號來存取該函數。
被宣告為 static 的物件識別符號可能為外部連結,也可能為內部連結,至於是哪一種連結形式,取決於物件的定義是在函數內還是函數外。被宣告為 static 的物件具有靜態儲存週期。因此,修飾符 static 允許定義區域性物件(也就是具有語句塊作用域的物件)為具有靜態的儲存週期。
(4) extern
被宣告為 extern 的函數和物件識別符號具有外部連結。可以在程式中任何地方使用這些識別符號。外部物件具有靜態的儲存週期。
(5) _Thread_local
修飾符 _Thread_local 宣告物件為執行緒區域性(thread-local),表示每個執行緒都分別具有該物件的範例。只有物件能被宣告為執行緒區域性,而函數不能。如果在函數內部宣告一個執行緒區域性物件,宣告必須具有修飾符 extern 或 static。在一個表示式中,執行緒區域性物件的識別符號參照當前執行緒中物件的本地範例,當前執行緒指當前計算該表示式的執行緒。