c語言的儲存類說明符有以下幾個,我來列表說明一下
說明符
用法auto
只在塊內變數宣告中被允許,表示變數具有本地生存期.
extern
出現在頂層或塊的外部變數函式與變數宣告中,表示宣告的物件
具有靜態生存期,連線程式知道其名字.
static
可以放在函式與變數宣告中.在函式定義時,其只用於指定函式
名,而不將函式匯出到連線程式.在函式宣告中,表示其後面會有
定義宣告的函式,儲存類為static.在資料宣告中,總是表示定義
的宣告不匯出到連線程式.
c99中規定,所有頂層的預設儲存類標誌符都是extern .
那麼我們如何來區分哪個標頭檔案中的宣告在其對應的.c檔案中有定義,而哪個又沒有呢?這也許不是必須的,因為無論在哪個檔案中定義,聰明的連線程式都會義無返顧的幫我們找到,並匯出到連線程式,但我覺得他確實必要的.因為我們需要知道這個函式的具體內容是什麼,有什麼功能,有了新需求後我也許要修改他, 我需要在短時間內能找到這個函式的定義,那麼我來介紹一下在c語言中乙個人為的規範:
在.h檔案中宣告的函式,如果在其對應的.c檔案中有定義,那麼我們在宣告這個函式時,不使用extern修飾符,如果反之,則必須顯示使用extern修飾符.
在大型專案中,對全域性變數的使用不可避免,比如,在first.c中需要使用乙個全域性變數g_test,那麼我們可以在first.h中,定義tpye g_test.與對函式的使用類似,在second.c中我們的開發人員發現他也需要使用這個全域性變數,而且要與first.c中一樣的那個,如何處理?對,我們可以仿照函式中的處理方法,在second.h中再次宣告tpye g_test,根據extern的用法,以及c語言中預設的儲存型別,在兩個標頭檔案中宣告的tpye g_test,其實其儲存型別都是extern,也就是說不必我們操心,連線程式會幫助我們處理一切.但我們又如何區分全域性變數哪個是定義宣告,哪個是引用宣告呢?這個比函式要複雜一些,一般在c語言中有如下幾種模型來區分: 1、
初始化語句模型
頂層宣告中,存在初始化語句是,表示這個宣告是定義宣告,其他宣告是引用宣告。c語言的所有檔案之中,只能有乙個定義宣告。
按照這個模型,我們可以在first.h中定義如下tpye g_test=1;那麼就確定在first中的是定義宣告,在其他的所有宣告都是引用宣告。
2、省略儲存型別說明
在這個模型中,所有引用宣告要顯示的包括儲存類extern,而每個外部變數的唯一定義宣告中省略儲存類說明符。
另外:h檔案和c檔案怎麼用呢?一般來說,h檔案中是declare(宣告),c檔案中是define(定義)。因為c檔案要編譯成庫檔案(windows下 是.obj/.lib,unix下是.o/.a),如果別人要使用你的函式,那麼就要引用你的h檔案,所以,h檔案中一般是變數、巨集定義、列舉、結構和函 數介面的宣告,就像乙個介面說明檔案一樣。而c檔案則是實現細節。
h檔案和c檔案最大的用處就是宣告和實現分開。這個特性應該是公認的了,但我仍然看到有些人喜歡把函式寫在h檔案中,這種習慣很不好。(如果是c++話, 對於其模板函式,在vc中只有把實現和宣告都寫在乙個檔案中,因為vc不支援export關鍵字)。而且,如果在h檔案中寫上函式的實現,你還得在 makefile中把頭檔案的依賴關係也加上去,這個就會讓你的makefile很不規範。
最後,有乙個最需要注意的地方就是:帶初始化的全域性變數不要放在h檔案中!
例如有乙個處理錯誤資訊的結構:
char* errmsg = ;
請不要把這個東西放在標頭檔案中,因為如果你的這個標頭檔案被5個函式庫(.lib或是.a)所用到,於是他就被鏈結在這5個.lib或.a中,而如果你的一 個程式用到了這5個函式庫中的函式,並且這些函式都用到了這個出錯資訊陣列。那麼這份資訊將有5個副本存在於你的執行檔案中。如果你的這個errmsg很 大的話,而且你用到的函式庫更多的話,你的執行檔案也會變得很大。
正確的寫法應該把它寫到c檔案中,然後在各個需要用到errmsg的c檔案頭上加上 extern char* errmsg; 的外部宣告,讓編譯器在鏈結時才去管他,這樣一來,就只會有乙個errmsg存在於執行檔案中,而且,這樣做很利於封裝。
我曾遇到過的最瘋狂的事,就是在我的目標檔案中,這個errmsg一共有112個副本,執行檔案有8m左右。當我把errmsg放到c檔案中,並為一千多 個c檔案加上了extern的宣告後,所有的函式庫檔案尺寸都下降了20%左右,而我的執行檔案只有5m了。一下子少了3m啊。
原文
C語言的標頭檔案
1.在c檔案中在函式外部宣告變數,稱為為全域性變數。1 全域性變數如果加static關鍵字,表示只能在本檔案內訪問,而且只能從宣告處到檔案末尾的範圍內訪問。宣告時如果沒有初始化,會自動初始化乙個值,例如static int x,x預設值為0。如果a 函式中用到變數x,而x的定義 static int...
C語言的標頭檔案
標頭檔案 a.h ifndef a h define a h 定義方法,不提供實現 int add int a,int b endif add.c include a.h 實現標頭檔案a中定義的方法 int add int a,int b main.c include include a.h 若想在...
c語言標頭檔案
c語言標頭檔案 每個c c程式通常分為兩個檔案。乙個檔案用於儲存 程式的宣告 declaration 稱為標頭檔案。另乙個檔案用於儲存 程式的實現 implementation 稱為定義 definition 檔案。c c程式的標頭檔案以 h 為字尾,c程式的定義檔案以 c 為字尾,c 程式的定義檔...