C儲存型別和型別限定符

2021-08-22 15:36:05 字數 1800 閱讀 7218

c儲存型別和型別限定符

(劉愛貴 - aiguille.liu)

c儲存類分為兩類:自動儲存類(automatic)和靜態儲存類(static)。宣告物件時使用的儲存類說明符以及宣告的上下文共同決定了物件的儲存類。

自動儲存類物件對於乙個程式塊來說是區域性的,在退出程式塊時該物件將消失。

(1) 如果沒有使用儲存類說明符,或者如果使用了auto限定符,則程式塊中的宣告生成的都是自動儲存類物件。

(2) 宣告為register的物件也是自動儲存類,並且如果可能,將被儲存在機器的快速暫存器中。

靜態物件可以是某個程式塊的區域性物件,也可以是所有程式塊的外部物件,在退出和進入函式或程式塊時其值將保持不變。

(1) 在乙個程式塊內,靜態物件用關鍵字static宣告。

(2) 在所有程式塊外部宣告且與函式定義在同一級的物件總是靜態的。

(3) 可以通過static關鍵字將物件宣告為某個特定翻譯單元的區域性物件,這種型別的物件將具有內部鏈結。

(4) 當省略顯式的儲存類或通過關鍵字extern進行宣告時,物件對整個程式是全域性訪問的,並且具有外部鏈結。

儲存類說明符有auto, register, static, extern和typedef。

(1) auto和register將宣告的物件說明為自動儲存類物件,這些物件僅可用在函式中。這種宣告也具有定義的作用,並將預留儲存空間。register說明的宣告等價於auto說明

的宣告,所不同的是,register暗示了宣告的物件將被頻繁地訪問,將盡可能儲存在暫存器中。如果乙個物件被宣告為register,則將不能對它應用一元運算子&,宣告為register

但實際按照auto型別處理的物件的位址進行計算是非法的。

(2) static將宣告的物件說明為靜態儲存類。這種物件可以用在函式內部或者函式外部。在函式內部,該說明符將引起儲存空間的分配,具有定義的作用。在函式外部,該說

明符將引起宣告物件為具有內部鏈結。

(3) 函式內部的extern宣告表明,被宣告的物件的儲存空間定義在其他地方。在函式外部,說明宣告的物件具有外部鏈結。

(4) typedef說明符並不會為物件預留存留空間。之所以將它稱為儲存類說明符,是為了語法描述上的方便。

乙個宣告中最多只能有乙個儲存類說明符。如果沒有指定儲存類說明符,則按照下列規則進行:

(1) 在函式內部宣告的物件被認為是auto型;

(2) 在函式內部宣告的函式被認為是extern型別;

(3) 在函式外部宣告的物件與函式將被認為是static型別的,具有外部鏈結。

型別限定符可以用於指定被宣告物件的特殊屬性,可以與任何型別說明符一起使用。型別限定符有:const和volatile。

(1) const用於宣告可以儲存在唯讀儲存器中的物件,並可能提高優化的可能性。可以對const物件進行初始化,但在初始化以後不能進行賦值。

(2) volatile用於強制某個實現遮蔽可能的優化。例如,對於具有記憶體映像輸入/輸出的機器,指向裝置暫存器的指標可以宣告為指向volatile的指標,目的是防止編譯器通過

指標刪除明顯多餘的引用。volatile物件沒有與實現無關的語義。

總結一下以上關鍵字說明的物件:

(1) static-靜態變數,作用範圍在乙個檔案內,只有在檔案內的**可以訪問;

(2) register-暫存器變數,可能的情況下會直接存放在機器的暫存器中;

(3) auto-儲存型別識別符號,表明變數具有本地範圍、塊範圍的宣告;

(4) extern-外部鏈結,即該變數或函式在其他檔案中可見;

(5) const-物件或變數不能被改變,能提高程式的健壯性;

(6) volatile-限定乙個物件可被外部改變。

linux volatile型別限定符

背景 一直會有意無意的看到有這個volatile,但是做為乙個在linux應用層寫了幾年 的程式設計師,還真的沒有搞懂什麼時候需要這樣用?查了一圈,網上都是各種告訴編譯器不要把該變數放到暫存器,放到暫存器,如果其它地方改了拿不到最新的值,不要優化等等 首先說下,組合語言真的屬於基本不會那種。多執行緒...

ANSIC型別限定符

以const型別關鍵字宣告的物件,其值不能通過賦值來遞增,遞減來修改。以下 const int a 12 限定a的值不能修改 a 12 不可以編譯器會報錯,但是可以初始化變數,因此下面的 沒問題 const int a 12 沒問題該宣告讓a成為唯讀變數。初始化後,就不能改變它的值。可以用const...

C C volatile型別限定符

volatile 限定符告知計算機,而不是變數所在的程式 可以改變該變數的值。通常,它被用於硬體位址以及在其他程式或同時執行的執行緒中共享資料。例如,乙個位址上可能儲存著當前的時鐘時間,無論程式做什 麼,位址上的值都隨時間的變化而改變。或者乙個位址用於接受另一台計算 機傳入的資訊。volatile的...