引言
要說(shuō)的話
模塊即是一個(gè).c 文件和一個(gè).h 文件的結(jié)合,頭文件(.h)中是對(duì)于該模塊接口的聲明;
#include …
…
//定義變量
unsigned char value;//全局變量
…
//定義函數(shù)
//這是本模塊第一個(gè)函數(shù),起到延時(shí)作用,只供本模塊的函數(shù)調(diào)用,所以用到static關(guān)鍵字修飾
/********************延時(shí)子程序************************/
static void delay (uint us) //delay time
{}
//這是本模塊的第二個(gè)函數(shù),要在其他模塊中調(diào)用
/*********************寫(xiě)字符程序**************************
** 功能:向LCD寫(xiě)入字符
** 參數(shù):dat_comm 為1寫(xiě)入的是數(shù)據(jù),為0寫(xiě)入的是指令
content 為寫(xiě)入的數(shù)字或指令
******************************************************/
void wr_lcd (uchar dat_comm,uchar content)
{}
……
……
/***************************** END Files***********************************/
//聲明全局變量
extern unsigned char value;
//聲明接口函數(shù)
extern void wr_lcd (uchar dat_comm,uchar content); //向LCD寫(xiě)入字符
……
/***************************** END Files***********************************/
-
在keil 編譯器中,extern這個(gè)關(guān)鍵字即使不聲明,編譯器也不會(huì)報(bào)錯(cuò),且程序運(yùn)行良好,但不保證使用其它編譯器也如此。強(qiáng)烈建議加上,養(yǎng)成良好的編程規(guī)范。
-
.c文件中的函數(shù)只有其它模塊使用時(shí)才會(huì)出現(xiàn)在.h文件中,像本地延時(shí)函數(shù)static void delay (uint us)即使出現(xiàn)在.h文件中也是在做無(wú)用功,因?yàn)槠渌K根本不去調(diào)用它,實(shí)際上也調(diào)用不了它(static關(guān)鍵字的限制作用)。
-
注意本句最后一定要加分號(hào)”;”,相信有不少同學(xué)遇到過(guò)這個(gè)奇怪的編譯器報(bào)錯(cuò): error C132: 'xxxx': not in formal parameter list,這個(gè)錯(cuò)誤其實(shí)是.h的函數(shù)聲明的最后少了分號(hào)的緣故。
#include“l(fā)cd_device.h //包含液晶驅(qū)動(dòng)程序頭文件,之后就可以在該.c文件中調(diào)用//lcd_device.h中的全局函數(shù),使用液晶驅(qū)動(dòng)程序里的全局//變量(如果有的話)。
…
//調(diào)用向LCD寫(xiě)入字符函數(shù)
wr_lcd (0x01,0x30);
…
//對(duì)全局變量賦值
value=0xff;
…
某模塊提供給其它模塊調(diào)用的外部函數(shù)及數(shù)據(jù)需在.h 中文件中冠以extern 關(guān)鍵字聲明;
比如上例的變量value就是一個(gè)全局變量,若是某個(gè)模塊也使用這個(gè)變量,則和使用外部函數(shù)一樣,只需在使用的模塊.c文件中包含#include“l(fā)cd_device.h”即可。
#ifdef xxx_GLOBALS
#define xxx_EXT
#else
#define xxx_EXT extern
#endif
#define xxx_GLOBALS
#include "includes.h"
#ifdef OS_GLOBALS
#define OS_EXT
#else
#define OS_EXT extern
#endif
OS_EXT INT32U OSIdleCtr;
OS_EXT INT32U OSIdleCtrRun;
OS_EXT INT32U OSIdleCtrMax;
#define OS_GLOBALS
#include “includes.h”
INT32U OSIdleCtr;
INT32U OSIdleCtrRun;
INT32U OSIdleCtrMax;
extern INT32U OSIdleCtr;
extern INT32U OSIdleCtrRun;
extern INT32U OSIdleCtrMax;
模塊內(nèi)的函數(shù)和全局變量需在.c 文件開(kāi)頭冠以static 關(guān)鍵字聲明;
比如上例在LCD驅(qū)動(dòng)模塊.c文件中定義的延時(shí)函數(shù)static void delay (uint us),這個(gè)函數(shù)冠以static修飾,一方面是限定了函數(shù)的作用范圍只是在本模塊中起作用,另一方面也給人傳達(dá)這樣的信息:該函數(shù)不會(huì)被其他模塊調(diào)用。
-
在函數(shù)體,一個(gè)被聲明為靜態(tài)的變量在這一函數(shù)被調(diào)用過(guò)程中維持其值不變。
-
在模塊內(nèi)(但在函數(shù)體外),一個(gè)被聲明為靜態(tài)的變量可以被模塊內(nèi)所用函數(shù)訪問(wèn),但不能被模塊外其它函數(shù)訪問(wèn)。它是一個(gè)本地的全局變量。
-
在模塊內(nèi),一個(gè)被聲明為靜態(tài)的函數(shù)只可被這一模塊內(nèi)的其它函數(shù)調(diào)用。那就是,這個(gè)函數(shù)被限制在聲明它的模塊的本地范圍內(nèi)使用。
永遠(yuǎn)不要在.h 文件中定義變量!
/*module1.h*/
int a = 5; /* 在模塊1 的.h 文件中定義int a */
/*module1 .c*/
#include "module1.h" /* 在模塊1 中包含模塊1 的.h 文件 */
/*module2 .c*/
#include "module1.h" /* 在模塊2 中包含模塊1 的.h 文件 */
/*module3 .c*/
#include "module1.h" /* 在模塊3 中包含模塊1 的.h 文件 */
/*module1.h*/
extern int a; /* 在模塊1 的.h 文件中聲明int a */
/*module1 .c*/
#include "module1.h" /* 在模塊1 中包含模塊1 的.h 文件 */
int a = 5; /* 在模塊1 的.c 文件中定義int a */
/*module2 .c*/
#include "module1.h" /* 在模塊2 中包含模塊1 的.h 文件 */
/*module3 .c*/
#include "module1.h" /* 在模塊3 中包含模塊1 的.h 文件 */
-
硬件驅(qū)動(dòng)模塊,一種特定硬件對(duì)應(yīng)一個(gè)模塊;
-
軟件功能模塊,其模塊的劃分應(yīng)滿(mǎn)足低偶合、高內(nèi)聚的要求。
往期好文合集
厲害了!華為繼鴻蒙OS后,即將發(fā)布國(guó)產(chǎn)編程語(yǔ)言,打破國(guó)外壟斷!
2020年9月編程語(yǔ)言排行榜:C語(yǔ)言繼續(xù)第一,你站哪個(gè)?
太贊了:中文版開(kāi)源!這或許是最經(jīng)典的計(jì)算機(jī)編程教材
??最 后
??
?
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問(wèn)題,請(qǐng)聯(lián)系我們,謝謝!