C 模板的分離編譯

2021-08-11 03:32:59 字數 767 閱讀 3472

首先,在c++中,為了乙個專案的規範,我們通常把**歸為三類:宣告檔案、實現檔案、測試檔案。

比如,我要用c++實現乙個鍊錶,那麼就會建立這3個檔案:

linklist.h   //鍊錶的相關宣告

linklist.cpp    //鍊錶的實現**

test.cpp    //鍊錶測試**

那麼問題來了,普通鍊錶這樣寫起來一點問題都沒有!

如果一旦,我仍然用以上檔案結構要通過類模板來實現鍊錶,編譯器就會報錯:無法解析的外部符號.....

那麼為什麼編譯器會報錯呢?

我們先來簡單的分析一下,編譯器報的這種錯誤屬於鏈結性錯誤,也就是當程式預處理、編譯、彙編、鏈結,在鏈結時出現了錯誤。

而一般出現鏈結錯誤,通常是因為,宣告了乙個函式,但是沒有寫實現體。

因此,當程式在鏈結時,從符號表中只找到了函式名,找不到具體函式實現的位址,因此編譯器會報出這樣的錯誤!

為什麼模板在分離編譯時會報錯呢?

我簡述一下,我們知道模板需要兩次編譯:

第一次編譯是在例項化之前:用來分析基本的語法錯誤,

第二次編譯是在例項化之後,當把這個型別替換之後,判斷有沒有語法錯誤。

重點就是在這裡:

我們模板**的實現體在乙個檔案裡,

而例項化模板的測試**在另乙個檔案裡,

編譯器編譯乙個檔案時並不知道另乙個檔案的存在,

因此,模板**就沒有進行例項化,編譯器自然不會為其生成**,因此會丟擲乙個鏈結錯誤!

C 模板分離編譯

乙個程式 專案 由若干個原始檔共同實現,而每個原始檔單獨編譯生成目標檔案,最後將所有目標檔案鏈結起來形成單一的可執行檔案的過程稱為分離編譯模式。假如有以下場景,模板的宣告與定義分離開,在標頭檔案中進行宣告,原始檔中完成定義 a.h template class t t add const t lef...

模板的分離編譯

模板為什麼不支援分離編譯 要了解這個問題,我們先來看一下程式在計算機中的執行過程,用一幅圖簡單說明。在乙個規範的c 檔案中,我們通常把乙個檔案分為 檔案宣告,檔案實現和檔案測試三個部分。在一般的編譯環境中,h檔案的 都會擴充套件到.cpp裡面,然後編譯器對.cpp檔案編譯形成.obj檔案,cpp以分...

模板的分離編譯

模板不支援分離編譯 我們來分析一下模板為什麼不支援分離編譯呢,所謂的分離編譯就是我們在編寫程式的時候可能會出現如下的一種情況就是,我下面就是舉具體的例子了 template.h includeusing namespace std templateclass a template.cpp inclu...