五月丁香激情综合免费视频_国产精品自产拍在线播放桃_午夜福利视频不卡a_免费在线观看亚洲视频_亚洲欧美精品丝袜一区区_国产情趣酒店鸳鸯浴在线观看_亚洲大片久久精品_巜朋友的人妻之诱感人妻

歡迎光臨東莞市飛江電子科技有限公司官網(wǎng)!
全國(guó)咨詢熱線

13926563901

18925580829

飛江淘寶店鋪

首頁(yè)>技術(shù)資料>51單片機(jī)

關(guān)于C語(yǔ)言多文件編寫的一點(diǎn)小小總結(jié)

發(fā)布時(shí)間:2018-04-03   瀏覽量:

關(guān)于C語(yǔ)言多文件編寫的一點(diǎn)小小總結(jié)

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