• 歡迎光臨東莞市飛江電子科技有限公司官網!
    全國咨詢熱線

    13926563901

    18925580829

    飛江淘寶店鋪

    首頁>技術資料>51單片機

    關于C語言多文件編寫的一點小小總結

    發布時間:2018-04-03   瀏覽量:

    關于C語言多文件編寫的一點小小總結

    在多文件編寫中,變量,尤其的全局變量的定義和引用顯得不那么精簡。很多人可能會想,把全局變量放在一個*.h文件中,然后在以后的調用中只要include一下不就可以了?想想也有道理,include不就是把*.h原封不動的復制過來嗎?但是,這樣存在一個問題。加入定義了10個全局變量,而在具體一個*.c文件中我只用其中一個。如果用include把全局變量全都包含進來。那利用率不就才是10%嗎。而且C語言常用于嵌入式,如果每個文件都include一個全局變量頭文件,那么這些變量就被分配一次內存,這對嵌入式來說肯定是致命的;另外,如果有很多個文件都include了全局變量的頭文件,編譯器要跟蹤每一個文件對其中一個變量的更改,這對編譯器來說也是吃不消的。
          所以便有了*.c和*.h的區別。
          很多人都知道聲明和定義的區別——一個分配內存,一個不分配內存,而且函數的聲明和定義更是顯而易見,但是對于變量的聲明和定義,就顯得有些模糊不清。由于如上所述的種種原因,C語言中全局變量放在*.c文件,而不放在*.h文件。這樣一來,*.h文件好像無用武之地了,非也。我們經常見到#include "****.h",但有誰見過#include "***.c"嗎?所以*.h文件用來聲明,*.c文件用來實現,在調用處用extern聲明。
            1、普通變量定義成全局變量
            如果是普通類型,完全可以不用*.h文件,直接在*.c文件中定義,在調用文件處用extern 聲明,因為對于普通類型,編譯器是可以識別的。比如在一個 my.c文件中,我定義了char name[10];那么在別的文件中只要用extern char name[](由于是聲明,一位數組可以省略大小,但不建議用指針,比較指針和數組是兩回事)外部聲明就可以了,告訴編譯器這個變量我已經定義過了,具體怎樣,你慢慢找吧。這符合常理,因為char是編譯器能自主識別的類型。
            2、自定義結構體類型定義成全局變量
            不同于普通類型,如果不預先通知編譯器,編譯器是不會識別你自定義的類型的。這個時候,*.h文件便出現了。不是定義結構類型不占內存嗎?那好,我大結構體的定義放在*.h文件中,這樣一來,無論你incude無數次,內存都不會被占用的。而且這樣還有個好處,在別的文件中可以include這個*.h文件,這樣,在這個文件中,編譯器就可以識別你的自定義類型了,目的不就達到了?  假如我在global.h中定義了
    typedef struct _POSITION
    {
            int x;
            int y;
    }POSITION;
    那么我可以在一個global.c文件中實現全局變量的定義,不過要include那個*.h文件,比如
    /* ***global.c ******* */
    include “global.h”
    POSITION current,;  
    這樣就定義了cunrrent這個變量,在別的文件中引用這個變量時,只要extern POSITION current;進行聲明,然后就可以用了,不過這個文件也還得include "global.h" 因為如果不包含,在這個文件中是不識別POSITION類型的。

    黑人粗大无码AV人妻一区