c語言全局變量的忠告 c語言存儲類說明符

1) 所有全局變量全部以g_開頭,並且儘可能聲明成static類型. 
2) 儘量杜絕跨文件訪問全局變量.如果的確需要在多個文件內訪問同一變量,應該由該變量定義所在文件內提供GET/PUT函數實現. 
3) 全局變量必須要有一個初始值,全局變量儘量放在一個專門的函數內初始化. 
4) 如調用的函數少於三個,請考慮改爲局部變量實現. 

 

 

存儲類說明符:

Auto:只在塊內變量聲明中被允許, 表示變量具有本地生存期.

Extern:出現在頂層或塊的外部變量函數與變量聲明中,表示聲明的對象具有靜態生存期,  連接程序知道其 名字.

Static:可以放在函數與變量聲明中,在函數定義時,只用於指定函數名,而不將函數導出到鏈接程序,在函數聲明中,表示其後邊會有定義聲明的函數,存儲類型static.在數據聲明中,總是表示定義的聲明不導出到連接程序.

 

1、函數

C語言中一個人爲的規範:在.h文件中聲明的函數,如果在其對應的.c文件中有定義,那麼我們在聲明這個函數時,不使用extern修飾符, 如果反之(在其.c中沒定義),則必須顯示使用extern修飾符.

所以在C語言的.h文件中,我們會看到兩種類型的函數聲明. 帶extern的,還不帶extern的, 簡單明瞭,一個是引用外部函數,一個是自己聲明並定義的函數.

2、全局變量.
全局變量的使用不可避免, 比如,在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語言中有如下幾種模型來區分:
a、初始化語句模型
頂層聲明中,存在初始化語句時,表示這個聲明是定義聲明,其他聲明是引用聲明。C語言的所有文件之中,只能有一個定義聲明。
按照這個模型,我們可以在first.h中定義如下TPYE G_test=1;那麼就確定在first中的是定義聲明,在其他的所有聲明都是引用聲明。
b、省略存儲類型說明
在這個模型中,所有引用聲明要顯示的包括存儲類extern,而每個外部變量的唯一定義聲明中省略存儲類說明符。
這個與我們對函數的處理方法類似,不再舉例說明。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章