[討論] 關於template inclusion model

看板C_and_CPP (C/C++)作者 ( .)時間13年前 (2012/09/08 20:22), 編輯推噓0(0015)
留言15則, 5人參與, 最新討論串1/1
最近我有一位做數值計算的同事,他用blitz與C++寫了一分計算核心給我。 他的程式全部的東西包含各物件成員函式實作都是在*.h檔案裡面。 然後最後有一個表頭檔去總和include所有相關.h,假設是"aa.h"。 我在用他的程式的時候發現到,如果我在兩個不同的編譯單元裡面各自放進了"aa.h" ,編譯器在連結期的時候會回報錯誤,說有multiple definition。 這讓我聯想到,在撰寫class template的時候,一般我們在運用這一些class template時 也是會把實作當作表頭檔引進。舉個例子,我可能在兩個不同的編譯單元都引進了 <vector>然後都用了std::vector<double>。如此一來,編譯器就會在編譯之前各自具 現化出std::vector<double>及其使用到的相關函數實作。但是在這種情況之下為什麼 編譯器在連結期不會跟我抱怨說std::vector<double>被重複定義了呢? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 123.205.186.80

09/08 20:32, , 1F
C的話,可以用ifdef xxx include 之類的方法
09/08 20:32, 1F

09/08 20:32, , 2F
避免重覆include
09/08 20:32, 2F

09/08 20:33, , 3F
打錯,是ifndef xxx include "aa.h" endif
09/08 20:33, 3F

09/08 20:42, , 4F
有時會用#ifndef __aa_h__和#endif把整個檔案包起來?
09/08 20:42, 4F

09/08 20:44, , 5F
google: weak symbol linker
09/08 20:44, 5F

09/08 23:08, , 6F
樓上都誤會我意思了,我真正想問的只有第二段。
09/08 23:08, 6F

09/08 23:09, , 7F
就是為什麼template不會被編譯器叫說重複定義。
09/08 23:09, 7F

09/08 23:09, , 8F
還有對於第一個回文的...
09/08 23:09, 8F

09/08 23:10, , 9F
你說得header guard是有被引入程式碼的,但是編譯器還是會叫
09/08 23:10, 9F

09/08 23:10, , 10F
重複定義。因為定義指的是在不同編譯單元之間的重複定義。
09/08 23:10, 10F

09/08 23:12, , 11F
你的header guard只有在一個編譯單元內有作用。
09/08 23:12, 11F

09/08 23:13, , 12F
我的問題只是從我非template程式碼遇到這問題來想為什麼
09/08 23:13, 12F

09/08 23:13, , 13F
template程式碼並沒有會遇到這種重複定義的問題?
09/08 23:13, 13F

09/08 23:54, , 14F
http://ppt.cc/IfkU linker 會幫你處理
09/08 23:54, 14F

09/08 23:56, , 15F
4 樓說的其實就是其中一種具現化策略
09/08 23:56, 15F
文章代碼(AID): #1GIpY5Oh (C_and_CPP)
文章代碼(AID): #1GIpY5Oh (C_and_CPP)