標頭檔案怎麼知道誰實現它的?

時間 2021-05-13 08:18:56

1樓:

你問得不是很清楚,我也不知道我以下的回答是不是你需要的。

假設有三個檔案

// a.h

int foo( void );

// a.cpp

int foo( void )

// b.cpp

#include "a.h"

int main( void )

其中對編譯器而言(預編譯之後),b.cpp 等同於

// b.cpp

int foo( void );

int main( void )

於是,第一點,你的問題與「標頭檔案」無關,「標頭檔案」只是將宣告提取出來,然後可供多個原始檔去include,而不必每個原始檔都浪費時間重寫一遍。

(注意:以下過程是常用的,但不是標準規定必須的)

接下來,編譯a.cpp,得到a.obj;編譯b.

cpp,得到b.obj。然後鏈結 a.

obj 和 b.obj,得到乙個可執行檔案比如hello.exe。

假如 b.cpp 中沒有 #include "a.h" 也沒有 int foo( void ),那就會編譯失敗,因為b.

cpp中呼叫了foo(),但編譯器卻不知道foo()是個啥。

現在將 a.obj 和 b.obj 鏈結起來,該有的都有了(有程式入口main函式,main直接或間接呼叫的foo函式也有了),自然可以生成乙個可執行檔案exe。

a. 「標頭檔案怎麼知道是誰實現了它呢?」 --- 標頭檔案不知道,也不需要知道。標頭檔案的存在只是保證「編譯(不包括link)」可以成功。

b. 「是編譯器分析出來了嗎?」 --- 是在編譯過程中的link階段查詢你傳給它的所有obj檔案,例如"linka.

obj b.obj/OUT:hello.

exe"可以,而"linka.obj/OUT:hello.

exe"就會失敗,因為它找不到foo的實現。

c. 「如果兩個實現會怎樣?」 --- 你自己試試不就知道了嗎?

2樓:cgoxopx

實現它的鏈結庫是你手動新增進去的,編譯器當然知道。

如果同乙個函式有兩個實現的話,靜態鏈結庫會報錯,動態鏈結庫按你鏈結的順序,後面的會覆蓋前面的

C 中的模板類宣告標頭檔案和實現檔案分離後,如何能實現正常編譯?

孫嘉成 把模板的宣告放在.h檔案中,實現放在.cpp檔案中,在main.cpp檔案中 include XX.cpp 同樣可以正常使用模板函式,但是這並不能實現您說的隱藏實現,只是表面上將宣告和實現分離了,沒什麼實際用處,只是看著好看一些,不建議使用。 zaoru 1.包含模型 常規寫法將實現寫在標頭...

QQ傳檔案是怎麼實現互相傳檔案的 ?

拋開QQ,從一般角度上聊聊p2p的檔案實時傳輸。原本很簡單的事情,因為nat的存在變得比較繁瑣,一些特殊情況需要特別優化。通常使用tcp協議進行檔案傳輸,假定A B S分別是兩個客戶端和Server。A B分別維護到S的信令通道,通過信令通道A B可以知道對方的網路型別 內網路ip和port。主要有...

檔案系統是怎麼通過路徑來知道檔案所在的磁碟位置?

這個問題其實包含兩個子問題 如何根據路徑,定位到改檔案的元資料所在的磁碟位置 如何根據檔案的元資料,找到檔案的資料 第乙個問題,涉及VFS層的資料結構設計 簡單來說是VFS根據目錄樹,逐層lookup,先檢查每級別的子目錄的dentry資料,dentry中會記錄name跟inode對映。第二個問題,...