C中的static和extern總結

我們知道,C語言中沒有類的概念,代碼都是以文件爲單位組織的。對於非局部變量和函數,只能在唯一的一個C文件中定義一次,多文件同時定義就會導致編譯器報重複定義的錯誤。而爲了能在其他C代碼文件中使用這些非局部變量和函數,就有了extern關鍵字。同時,爲了文件的代碼隔離,有些變量和函數不想被其他文件訪問,就有了static關鍵字。
下面將圍繞extern和static說明它們的作用。

1. extern 

1.1 extern修飾變量

爲了使用在其他文件或其他地方定義的變量,需要使用extern來聲明該變量。這裏的"其他地方",比如在C++中,同一個源碼文件,在定義該變量之前使用該變量;
當然在較老版本的C中,變量和函數必須先定義,才能使用。
舉例來說,在a.c中定義的 int x; ,在b.c中 extern int a;,如果放於某個函數中,則可見性僅限該函數內;如果放於函數外,則對於定義該函數的文件內的所有函數都是可見的。
extern int a; 要求a的鏈接屬性是外鏈接(external)的,如果a本身不符合外鏈接屬性,即使extern修飾了該變量,也引用不成功。

1.2 extern修飾函數

與extern修飾變量類似,被修飾的函數也應是外鏈接的,才能引用。

1.3 extern和include

我們知道,引用其他模塊的函數和變量,最常見的就是使用"#include"來修飾包含被引用函數的頭文件,和這裏extern作用類似。它們的區別主要是:
"include"聲明頭文件一次,就可以批量應用該頭文件下的所有外鏈接的函數和變量;extern只能一次聲明一個變量或函數;
extern目標明確,直接了當,代碼結構清晰,也會加速編譯過程,節省時間;
所以,如果需要多次引用同一個文件下的函數或變量,用"include"合適;否則使用extern合適。

1.4  extern "C"

在C++中調用C庫,經常見到這樣的代碼,來聲明要使用的函數是來自C中的。作用是告訴鏈接器,要使用C的函數命名規範來鏈接,而不是C++的。
因爲C++編譯後的函數命名和C的不同,如果使用C++的命名,鏈接器可能找不到編譯後的函數。

2. static  

2.1 static局部變量

局部變量在函數中定義,通常是存放在棧中的,它的生命週期隨着函數執行的結束而終止。而static修飾局部變量後,它存放於靜態存儲區.data段,.data段裏面存放已初始化的全局變量。static局部變量的生命週期將隨程序的結束而終止,而與定義它的函數的執行無關。但是由於它仍是一個局部變量,故它的作用域仍然是該函數內。同時,該變量只在初次定義時被初始化一次。如果沒有顯示的初始,那麼系統會默認賦值。對於int型變量,系統會自動對其賦值爲0,對於字符數組,會自動賦值爲'\0'。

對於一次程序執行而言,static局部變量的每次操作,都是在上一次操作後的值的基礎上進行操作的,對於多線程編程,這是需要注意的地方,需要做好代碼塊同步。

2.2 static全局變量

前面我們提到,可以通過extern修飾變量來引用在其他地方定義的全局變量,且該變量需爲外鏈接的。而如果定義的全局變量不想被其他文件引用,即只在定義該全局變量的文件內有效的話,可以用static修飾全局變量達到這樣的效果。這叫做靜態全局變量。和其他的全局變量的存儲相同,靜態全局變量也是在.data段(已初始化)或者.bss段(未初始化)內存放的。

2.3 static函數

同static全局變量一樣,static修飾函數也將函數的訪問範圍限定在了定義該函數的文件內部。外界的extern引用訪問會報編譯錯誤。好比面嚮對象語言中類中的private修飾符一樣。

 

3. static和extern可以同時用嗎?

其實上面我們已經說的很清楚了,static修飾的變量和函數的作用範圍北限定於定義它們的文件內部。而extern修飾的變量和函數說明要引用在其他地方定義的變量和函數,顯然這是兩個矛盾的修飾符。更深層次的講,extern要求引用的變量和函數是外鏈接的,他需要通過符號表名稱進行鏈接,而static恰恰會移除符號表名稱。即使在同一個文件裏,static和extern同時修飾一個變量或函數來聲明,之後再用static定義該函數, 依然是編譯報錯的。有興趣的朋友可以去試試。

 

以上就是我對C中的static和extern總結,如有不足之處,歡迎指正。

版權聲明:本文爲博主原創文章,未經博主允許不得轉載;來自https://blog.csdn.net/milanac007/article/details/83383846

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章