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