模塊化編程學(xué)習(xí)

本文參考CSDN朱工的專欄--嵌入式C語言之---模塊化編程

模塊化編程是將自己要實(shí)現(xiàn)的功能作為一個(gè)模塊來進(jìn)行編寫,可以單獨(dú)進(jìn)行調(diào)試,并且留出接口供給其他模塊。
基本方法: 一個(gè)功能實(shí)現(xiàn)文件 .C文件 以及 一個(gè)頭文件 .H 文件
以下為項(xiàng)目舉例,便于理解:

dsp.c文件

/**************************************************
DSP處理模塊
編寫人:Potato
**************************************************/ 
unsigned char Rec;  //定義局部變量
unsigned char Sent; //定義全局變量
void send(int a,int b)  //主函數(shù)中發(fā)送
{//功能實(shí)現(xiàn)}  
void reveive(int c)   //本地函數(shù)中接收
{//功能實(shí)現(xiàn)}  

dsp.h文件

/**************************************************
DSP處理頭文件
編寫人:Potato
**************************************************/
//全局性的函數(shù)與變量在頭文件中聲明
//聲明全局變量  
extern unsigned char Sent;  
//聲明接口函數(shù)  
extern void send(int a,int b); //發(fā)送字符
……  

用法

main.c

#include<dsp.h> //如果要使用Send()函數(shù)
...
send(Sent,anthor);

下面為摘抄的模塊化方法

另一種說明
在one.c中定義且初始化:u8 N =0;
再在one.h中用extern聲明:extern u8 N;(注:此處不能加=0)
最后在two.c中包含one.h:#include "one.h"
由于方法2的可移植性較方法一要強(qiáng),故采用2較好!
對(duì)方法2的總結(jié)為:全局變量的定義和初始化放在c文件中,聲明放在對(duì)應(yīng)的h文件中。 且要注意h文件里應(yīng)僅有相應(yīng)c文件里的函數(shù)和變量的聲明,和相應(yīng)c文件無關(guān)的東西不應(yīng)該有。

進(jìn)一步

一般變量和函數(shù)是不可以在頭文件中定義的,只能在頭文件中聲明。因?yàn)楹瘮?shù)只能有一次定義,而可以有多次聲明,當(dāng)頭文件被多次包含的時(shí)候,如果頭文件中有函數(shù)定義就違背了這個(gè)原則。

#ifndef XXX_H
#define XXX_H
class CA {
......
}
#endif

即使你將定義寫在頭文件中
如果頭文件中沒有這樣定義的話,多次包含一樣編譯不通過.

知識(shí)普及 變量與聲明

變量聲明和定義的區(qū)別
引自(http://www.cnblogs.com/GavinDai/archive/2011/10/24/2222735.html)
我們?cè)诔绦蛟O(shè)計(jì)中,時(shí)時(shí)刻刻都用到變量的定義和變量的聲明,可有些時(shí)候我們對(duì)這個(gè)概念不是很清楚,知道它是怎么用,但卻不知是怎么一會(huì)事,下面我就簡單的把他們的區(qū)別介紹如下:(望我的指點(diǎn)對(duì)你受益)
變量的聲明有兩種情況:
1、一種是需要建立存儲(chǔ)空間的。例如:int a 在聲明的時(shí)候就已經(jīng)建立了存儲(chǔ)空間。
2、另一種是不需要建立存儲(chǔ)空間的。 例如:extern int a 其中變量a是在別的文件中定義的。
前者是“定義性聲明(defining declaration)”或者稱為“定義(definition)”,而后者是“引用性聲明(referncing declaration)”,從廣義的角度來講聲明中包含著定義,即定義是聲明的一個(gè)特例,所以并非所有的聲明都是定義,例如:int a 它既是聲明,同時(shí)又是定義。然而對(duì)于 extern a 來講它只是聲明不是定義。一般的情況下我們常常這樣敘述,把建立空間的聲明稱之為“定義”,而把不需要建立存儲(chǔ)空間的聲明稱之為“聲明”。很明顯我們?cè)谶@里指的聲明是范圍比較窄的,即狹義上的聲明,也就是說非定義性質(zhì)的聲明,例如:在主函數(shù)中:

int main() {
extern int A;
//這是個(gè)聲明而不是定義,聲明A是一個(gè)已經(jīng)定義了的外部變量
//注意:聲明外部變量時(shí)可以把變量類型去掉如:extern A;
dosth(); //執(zhí)行函數(shù)
}
int A; //是定義,定義了A為整型的外部變量

外部變量的“定義”與外部變量的“聲明”是不相同的,外部變量的定義只能有一次,它的位置是在所有函數(shù)之外,而同一個(gè)文件中的外部變量聲明可以是多次的,它可以在函數(shù)之內(nèi)(哪個(gè)函數(shù)要用就在那個(gè)函數(shù)中聲明)也可以在函數(shù)之外(在外部變量的定義點(diǎn)之前)。系統(tǒng)會(huì)根據(jù)外部變量的定義(而不是根據(jù)外部變量的聲明)分配存儲(chǔ)空間的。對(duì)于外部變量來講,初始化只能是在“定義”中進(jìn)行,而不是在“聲明”中。所謂的“聲明”,其作用,是聲明該變量是一個(gè)已在后面定義過的外部變量,僅僅是為了“提前”引用該變量而作的“聲明”而已。extern 只作聲明,不作任何定義。
(我們聲明的最終目的是為了提前使用,即在定義之前使用,如果不需要提前使用就沒有單獨(dú)聲明的必要,變量是如此,函數(shù)也是如此,所以聲明不會(huì)分配存儲(chǔ)空間,只有定義時(shí)才會(huì)分配存儲(chǔ)空間。)**
用static來聲明一個(gè)變量的作用有二:
(1)對(duì)于局部變量用static聲明,則是為該變量分配的空間在整個(gè)程序的執(zhí)行期內(nèi)都始終存在。
(2)外部變量用static來聲明,則該變量的作用只限于本文件模塊。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容