詳解keil採用C語言模組化編程時全域變數、結構體的定義、聲明以及標頭檔包含的處理方法!

來源:互聯網
上載者:User

       以前寫單片機程式時總是把所用函數和變數都寫在一個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檔案中使用,那麼就應該在標頭檔中定義該結構體,再在要用它的檔案中包含結構體定義 所在的標頭檔即可。

 

最後,相信很多人都遇到過上述困惑吧,但願本文能為你解惑!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.