關於標頭檔案和原始檔的分別
首先,我們可以將所有東西都放在乙個.cpp檔案內.
然後編譯器就將這個.cpp編譯成.obj,obj是什麼東西?
就是編譯單元了.乙個程式,可以由乙個編譯單元組成,
也可以有多個編譯單元組成. 如果你不想讓你的源**變得很難閱讀的話,
就請使用多個編譯單元吧.(乙個函式不能放到兩個編譯單元裡面,但兩個以上
就可以分別放在乙個單元,也就是cpp裡面)
那麼就是乙個.cpp對應乙個.obj,然後將所有的obj鏈結起來(通過乙個叫鏈結器的程式),
組成乙個.exe,也就是程式了.
如果乙個.cpp要用到另乙個.cpp定義的函式怎麼辦? 只需在這個.cpp種寫上他的函式宣告
就可以了.其餘工作由鏈結器幫你完成,你可以隨便呼叫該函式.
鏈結器將所有的obj連線起來,但是如果碰巧有相同的函式或外部變數怎麼辦?他如何識別?
一般來說是不能允許在同乙個程式中,出現兩個一樣的函式名或外部變數名.
但是只得慶幸的是,c++可以通過一種叫做鏈結屬性的關鍵字來限定,你這個函式是屬於整個程式
公用的,還是只是在乙個編譯單元obj裡面使用的.
這些關鍵字就是extern 和 static; extern是外部鏈結的意思,也就是除了這個單元,外部的單元
也是能夠訪問這個函式的.static 是內部鏈結,自屬於自己單元.
說了這麼久,還沒有說.h的作用呢?
其實沒有.h也能很好的工作,但是當你發現乙個外部鏈結的函式或外部變數,需要許多份
宣告,因為c++這種語言,在使用函式和變數的時候,必須將他宣告,為何要宣告?宣告之後才
知道他的規格,才能更好的發現不和規格的部分.你別妄想乙個編譯單元,會自動從另乙個
編譯單元那裡得到什麼資訊,知道你是如何定義這個函式的.
所以說,只要使用到該函式的單元,就必須寫乙份宣告在那個.cpp裡面,這樣是不是很麻煩,
而且,如果要修改,就必須乙個乙個修改.這真讓人受不了.
.h就是為了解決這個問題而誕生,他包含了這些公共的東西.然後所有需要使用該函式的.cpp,只需要
用#include包含進去便可.以後需要修改,也只是修改乙份內容.
請注意不要濫用.h,.h裡面不要寫**,.h不是.cpp的倉庫,什麼都塞到裡面.
如果在裡面寫**,當其他.cpp包含他的時候,就會出現重複定義的情況,
比如將函式func();放到標頭檔案a.h,裡面還有一些a.cpp需要的宣告等;
然後你發現b.cpp需要用到a.cpp裡面的乙個函式,就很高興的將a.h包含進來.
注意,#include並不是什麼申請指令,他就是將指定的檔案的內容,原封不動的拷貝
進來.這時候實際上a.cpp和b.cpp都有乙個func()函式的定義.
如果這個函式是內部鏈結static的話,還好,浪費了一倍空間;
如果是extern,外部鏈結(這個是預設情況),那麼根據在同乙個程式內不可出現
同名函式的要求,聯結器會毫不留情給你乙個連線錯誤!
本文**:http://www.cnblogs.com/charles2008/archive/2009/09/03/1559896.html
關於標頭檔案和原始檔的分別
關於標頭檔案和原始檔的分別 首先,我們可以將所有東西都放在乙個.cpp檔案內.然後編譯器就將這個.cpp編譯成.obj,obj是什麼東西?就是編譯單元了.乙個程式,可以由乙個編譯單元組成,也可以有多個編譯單元組成.如果你不想讓你的源 變得很難閱讀的話,就請使用多個編譯單元吧.乙個函式不能放到兩個編譯...
關於標頭檔案和原始檔的分別
關於標頭檔案和原始檔的分別 首先,我們可以將所有東西都放在乙個.cpp檔案內.然後編譯器就將這個.cpp編譯成.obj,obj是什麼東西?就是編譯單元了.乙個程式,可以由乙個編譯單元組成,也可以有多個編譯單元組成.如果你不想讓你的源 變得很難閱讀的話,就請使用多個編譯單元吧.乙個函式不能放到兩個編譯...
標頭檔案和原始檔
一.例1 test.h void show test.cpp include using namespace std void show includeproblem.cpp include test.h int main 可以看到 includeproblem.cpp檔案彙總 include te...