以前寫單片機程式時總是把所用函數和變數都寫在一個c檔案裡,後來遇到大點的項目,程式動則幾千行,這種方式無疑會帶來N多麻煩,相信大家都有所體驗吧!
後來學會了在keil裡進行模組化編程,即只把功能相同或相近的函數寫在同一個c檔案,這樣以來一個項目往往由很多個c檔案組成,但又帶來一個問題即是某些c檔案之間需要相互連信,一般我們都採用了全域變數,對吧。很多同學雖然知道在其它c檔案裡引用全域變數要用extern進行聲明,但對此操作時往往思路不清,迷迷糊糊,經常遇到一堆錯誤提示,然後一個一個排除,既費時又費力,可怕的是下次還會遇到同樣的問題。本人曾經也遇到過類似問題,故在此將模組化編程裡的全域變數、結構體、標頭檔相關問題詳述一遍,大家照著做,就能確保無誤!
一、關於全域變數的定義、聲明、引用:
方法1:
在某個c檔案裡定義全域變數後,在其它c檔案要用,則在要用c檔案裡用extern進行聲明。說來輕巧但還是很多同學會出問題。請看下面注意事項方可解決!
註:
(1)在定義全域變數時可同時將其初始化
(2)在用extern聲明時不能再初始化,否則編譯器報錯
舉例:有兩個c檔案分別為one.c和two.c,two中要用到one中的全域變數N,怎麼辦?
答案:在one.c中定義且初始化:u8 N = 0;
再在two.c中聲明:extern u8 N;(註:此處不能加= 0)
方法2:
同樣對於方法1中的例子,我推薦採用方法2。
答案:在one.c中定義且初始化:u8 N = 0;
再在one.h中用extern聲明:extern u8 N;(註:此處不能加= 0)
最後在two.c中包含one.h:#include "one.h"
由於方法2的可移植性較方法一要強,故採用2較好!
對方法2的總結為:全域變數的定義和初始化放在c檔案中,聲明放在對應的h檔案中。 且要注意h檔案裡應僅有
相應c檔案裡的函數和變數的聲明,和相應c檔案無關的東西不應該有。
二、關於標頭檔的包含:
標頭檔的包含就比較簡單了:在相應c檔案裡一一包含所需的h檔案即可。但千萬不要將這些標頭檔全部放在c檔案的相應標頭檔裡,雖然這樣會使c檔案僅包含了一個標頭檔,看起來比較簡潔,但這樣會影響它的h檔案的“純潔性”。
在此提醒下新手們:要將c檔案和其對應的h檔案看成一體,即它們互相有著緊密聯絡;移植時,將它們同時搬走就行!
三、關於結構體類型的定義:
1、若結構體類型只需要在某個c檔案中使用,那麼就在相應c檔案裡定義該結構體即可。
2、若結構體類型要在多個c檔案中使用,那麼就應該在標頭檔中定義該結構體,再在要用它的檔案中包含結構體定義 所在的標頭檔即可。
最後,相信很多人都遇到過上述困惑吧,但願本文能為你解惑!