C語言中文網 目錄

C語言存儲類修飾符

聲明中出現的存儲類修飾符(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。在一個表達式中,線程局部對象的標識符引用當前線程中對象的本地實例,當前線程指當前計算該表達式的線程。

精美而實用的網站,提供C語言C++STLLinuxShellJavaGo語言等教程,以及socketGCCviSwing設計模式JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo