關於標頭檔案和原始檔的分別

2021-06-16 04:51:20 字數 1475 閱讀 3951

關於標頭檔案和原始檔的分別

首先,我們可以將所有東西都放在乙個.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,外部鏈結(這個是預設情況),那麼根據在同乙個程式內不可出現

同名函式的要求,聯結器會毫不留情給你乙個連線錯誤!

關於標頭檔案和原始檔的分別

關於標頭檔案和原始檔的分別 首先,我們可以將所有東西都放在乙個.cpp檔案內.然後編譯器就將這個.cpp編譯成.obj,obj是什麼東西?就是編譯單元了.乙個程式,可以由乙個編譯單元組成,也可以有多個編譯單元組成.如果你不想讓你的源 變得很難閱讀的話,就請使用多個編譯單元吧.乙個函式不能放到兩個編譯...

C 關於標頭檔案和原始檔的分別

關於標頭檔案和原始檔的分別 首先,我們可以將所有東西都放在乙個.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...