天天看點

C語言 static和extern知識點static關鍵字extern關鍵字

static關鍵字

static關鍵字一共有3個不同的用途:

  1. 用于函數内部的局部變量聲明時,static關鍵字的作用是改變局部變量的存儲類型,從自動變量改為靜态變量,也就是說這個局部變量不在存儲在堆棧或寄存器中,而是在編譯的時候由編譯器配置設定一個靜态的位址空間,但這個變量的作用域不受影響,依然僅局限在聲明它的函數内部才可以通路。需要說明的是一旦函數内部的局部變量被聲明為static,這個函數就有可能變得不可重入(可重入是指相同的參數輸入會有相同的結果輸出)
  2. 如果static關鍵字用于函數定義時,這個函數就隻能在定義該函數的C檔案中引用,該C檔案外的代碼将無法調用這個函數。
  3. 在用于全局變量的聲明時,static關鍵字的作用類似于函數的情況,這個全局變量的作用域将局限在聲明該變量的C檔案内部,這個C檔案之外的代碼将無法通路這個變量(事實上,如果采用指針的方式進行通路時可以的,但是這樣就違背了将一個全局變量聲明為static的初衷了)

對于函數名和全局變量的static聲明類似于C++中的private關鍵字,利用static關鍵字可以再C程式中實作類似于C++中封裝的概念,将局部的、私有的函數或變量聲明為static,可以屏蔽C檔案中的實作細節,降低一個項目中若幹C檔案之間的耦合度,為軟體的子產品化開發、測試、維護、移植提供便利條件。

extern關鍵字

預設情況下,C語言中的全局變量和函數的作用域僅限于定義或什麼這個函數或變量的C檔案内部,如果需要從這個C檔案之外通路這些函數或者全局變量就需要使用extern關鍵字。這是因為C編譯器是以C檔案為機關進行編譯的,如果這個C檔案中引用了其他檔案中定義的函數或變量,編譯器将無法找到這個函數或變量的定義,進而給出該函數或變量未定義的錯位資訊。

使用extern的方式有2種:

1.在C檔案中直接聲明某個其他檔案中定義的函數或全局變量為extern,進而告訴編譯器這個函數或變量是在其他C檔案中定義的。

2.在頭檔案中聲明某個函數或變量為extern,然後在需要引用該函數或變量的C檔案中包含這個頭檔案

繼續閱讀