一直以為自己對模組化程式設計徹底明白了,但是偶爾看到有些條件編譯感覺莫名其妙,今天一起做個總結。
1、單個功能模組建立原始檔.c,和標頭檔案.h,注意.c字尾對於c語言必須小寫,有些編譯器(如gcc),會認為大寫c字尾是c++檔案。
2、對於功能模組內部使用的全域性變數、函式不要放到標頭檔案中,應該用static宣告放到原始檔模組的前面部分,這樣做防止多檔案鏈結的時候(編譯的時候不會出錯)出現函式名、變數名的重名衝突
錯誤(即使大小寫不同如int a和int a也會)。
3、對於標頭檔案加上#ifndef *** #define ***啥是為了防止在同乙個原始檔中某個標頭檔案被多次引用(又稱包含),否則檔案重複包含錯誤,而不是函式重複定義錯誤。
4、對於標頭檔案中盡量不要去定義變數,變數的定義應該放到原始檔中,標頭檔案加extern 宣告即可,雖然c語言函式宣告標頭檔案中預設加extern,但為了便於理解加上extern.
5、標頭檔案中放什麼合適:巨集定義、型別重定義、結構體重定義以及該原始檔模組需要被外部訪問的函式介面、全域性變數介面。
6、原則上多個檔案之間共享變數不在某個標頭檔案中定義,而是採用第5條規則,原始檔中定義標頭檔案中宣告,但是,ucosii實時作業系統中有一種方法非常好,同在ucosii.h這個標頭檔案中定義全域性資料結構來使系統其他核心檔案共享這些資料結構,處理方式很巧妙。具體做法是:在標頭檔案開頭
#ifdef os_globals
#define os_ext
#else
#define os_ext extern
#endif
定義變數時os_ext os_tcb *ostcbcur;
而在郵箱、訊號量啥原始檔開頭都有這樣一段**
#ifndef os_master_file
#include
#endif
唯獨在core.c檔案中
#ifndef os_master_file
#define os_globals
#include
#endif
這麼一來只有在編譯core.c檔案時標頭檔案中的資料結構編譯成定義的形式,其他原始檔編譯成宣告的形式,以後可以借鑑。
7、當頭檔案比較多時,每個原始檔模組乙個乙個新增標頭檔案方法不合理,應該定義乙個標頭檔案config.h,然後把所有的標頭檔案都放到這個
檔案中,主要不要加防重複包含處理,只是把所有的標頭檔案包含進去。對於便於管理可以在工程目錄新建乙個資料夾專門存標頭檔案,這樣的話標頭檔案要寫成
#include"..\user\task.h",表示首先退出當前一級檔案目錄,然後進入user資料夾然後找到task.h標頭檔案,所有的原始檔、標頭檔案中都加上
#include「
config.h」就行了,非常方便。
js模組化程式設計總結
乙個更偏向於伺服器端的規範,同步載入模組 require命令第一次載入該指令碼時就會執行整個指令碼,然後在記憶體中生成乙個物件.math.js exports.add function a,b var math require math math.add 2,3 5 運用 nodejs 非同步指的是...
模組化程式設計
將乙個5元素陣列,右移n位,n從鍵盤輸入,首尾相接 例如 陣列中的元素為 那麼 n 3 的結果如下 資料是向右邊移三位,那麼,我轉化成先移一位的情況。因為當移一位的問題解決了,移動n位只需要將此過程迴圈n次即可 1.把a 1 放到臨時空間t t a 1 2.依次把前面元素的值放到後面的空間裡面.從後...
C語言模組化程式設計
c語言模組化程式設計 模組劃分 c語言模組化程式 設計需理解如下概念 1 模組即是乙個.c檔案和乙個.h檔案的結合,標頭檔案 h 中是對於該模組介面的宣告 2 某模組提供給 其它模組呼叫的外部函式及資料需在.h中檔案中冠以extern關鍵字宣告 3 模組內的函式和全域性變數需在.c檔案開頭冠以sta...