原文轉載於:http://blog.csdn.net/zhzht19861011/article/details/5974945,非常感謝。
初學者往往搞不懂如何模組化編程,其實它是簡單易學,而且又是組織良好程式結構行之有效方法之一。
本文將先大概講一下模組化的方法和注意事項,最後將以初學者使用最廣的keil c編譯器為例,給出模組化編程的詳細步驟。
模組化程式設計應該理解以下概述:
(1) 模組即是一個.c 檔案和一個.h 檔案的結合,標頭檔(.h)中是對於該模組介面的聲明;
這一條概括了模組化的實現方法和實質:將一個功能模組的代碼單獨編寫成一個.c檔案,然後把該模組的介面函數放在.h檔案中.舉例:假如你用到液晶顯示,那麼你可能會寫一個液晶驅動模組,以實現字元、漢字和映像的現實,命名為: led_device.c,該模組的.c檔案大體可以寫成:
[cpp] view plain copy print ? /************************************************************************* * 液晶驅動模組 * * 文 件: lcd_device.c * 編 寫 人: 小瓶蓋 * 描 述:液晶串列顯示驅動模組,提供字元、漢字、和映像的實現介面 * 編寫時間: 2009.07.03 * 版 本:1.2 *************************************************************************/ #include … … //定義變數 unsigned char value;//全域變數 … //定義函數 //這是本模組第一個函數,起到延時作用,只供本模組的函數調用,所以用到static關鍵字修飾 /********************延時子程式************************/ static void delay (uint us) //delay time {} //這是本模組的第二個函數,要在其他模組中調用 /*********************寫字元程式************************** ** 功能:向LCD寫入字元 ** 參數:dat_comm 為1寫入的是資料,為0寫入的是指令 content 為寫入的數字或指令 ******************************************************/ void wr_lcd (uchar dat_comm,uchar content) {} …… …… /***************************** END Files***********************************/
註:此處唯寫出這兩個函數,第一個延時函數的作用範圍是模組內,第二個,它是其它模組需要的。為了簡化,此處並沒有寫出函數體.
.h檔案中給出模組的介面.在上面的例子中, 向LCD寫入字元函數:wr_lcd (uchar dat_comm,uchar content)就是一個介面函數,因為其它模組會調用它,那麼.h檔案中就必須將這個函式宣告為外部函數(使用extrun關鍵字修飾),另一個延時函數:void delay (uint us)只是在本模組中使用(本地函數,用static關鍵字修飾),因此它是不需要放到.h檔案中的。
.h檔案格式如下:
[cpp] view plain copy print ? /***************************************************************************** * 液晶驅動模組 標頭檔 * * 文 件: lcd_device.h * 編 寫 人: 小瓶蓋 * 編寫時間: 2010.07.03 * 版 本:1.0 *********************************************************************************/ //聲明全域變數 extern unsigned char value; //聲明介面函數 extern void wr_lcd (uchar dat_comm,uchar content); //向LCD寫入字元 …… /***************************** END Files***********************************/
這裡注意三點:
1. 在keil 編譯器中,extern這個關鍵字即使不聲明,編譯器也不會報錯,且程式運行良好,但不保證使用其它編譯器也如此。強烈建議加上,養成良好的編程規範。
2. .c檔案中的函數只有其它模組使用時才會出現在.h檔案中,像本地延時函數static void delay (uint us)即使出現在.h檔案中也是在做無用功,因為其它模組根本不去調用它,實際上也調用不了它(static關鍵字的限制作用)。
3.注意本句最後一定要加分號”;”,相信有不少同學遇到過這個奇怪的編譯器報錯: error C132: 'xxxx': not in formal parameter list,這個錯誤其實是.h的函式宣告的最後少了分號的緣故。
模組的應用:假如需要在LCD菜單模組lcd_menu.c中使用液晶驅動模組lcd_device.c中的函數void wr_lcd (uchar dat_comm,uchar content),只需在LCD菜單模組的lcd_menu.c檔案中加入液晶驅動模組的標頭檔lcd_device.h即可.
[cpp] view plain copy print ?