C 函式模板在 hpp中定義和實現,當有多個檔案包含該標頭檔案時編譯出現重複定義的問題,該如何解決?

時間 2021-06-20 03:29:24

1樓:任黑

你這情況至少可以肯定不是開源的庫。

誰寫的,把ta打一遍。

既然不能編譯,那肯定是類外的函式了,因為類內的都是內聯的。

採用Single-file library的寫法:

//這裡寫函式宣告

#ifdef IMPLEMENTATION//這裡寫函式實現

#endif

然後僅在包含該檔案的乙個cpp中,在包含該檔案前#define IMPLEMENTATION

2樓:C十十20年

參見《C++設計精要教程》關於變數、函式說明和定義的區別,不應在.h和.hpp檔案中進行變數或函式定義。

如果.h或.hpp僅包含變數和函式說明,即使在乙個.

cpp檔案中,連續包含同乙個.h檔案多次,也是可以的,因為變數可以重複說明多次。例如,你可以在乙個.

cpp檔案中連續寫二個extern int x; extern int x; 但是,變數定義只能進行一次,因此,只能在乙個.cpp檔案中,對某.h檔案使用#include僅一次;而不同的.

cpp對某.h檔案使用#include,也會造成同一變數被定義多次,這在編譯連線階段會出錯。

如果在.h檔案中,在變數或函式定義前加上static或者inline,將使每個.cpp定義檔案級作用域的變數或函式一次。

特別地,如果你的程式通過include定義了多個檔案作用域的相同功能的同名函式,將使你的程式變得又臭又長,這恐怕是不值得的。

3樓:杜紫童

兩個辦法:

類成員;

inline。

PS,這兩個其實是同乙個辦法,類成員永遠inline。

PS2, C++的inline跟C的inline含義不同,不要混淆。

C 繼承模板類 引數是子類 替代虛函式。模板類只能訪問子類公共成員,受保護的不行?

Jon Lee 這是CRTP curiously recurring template pattern,https en.m.wikipedia.org wiki Curiously recurring template pattern 通過把建立虛函式表vtable的過程搬到編譯時間來提高效率。對...

C 如何在類中定義乙個 C 函式(不用傳遞 this,非友元,非靜態)?

悽臨雨 無捕獲的lambda,可以轉型為c函式指標。類內巢狀類可以定義靜態函式 不一定合乎要求 但據我所知都只能獲取指標,沒辦法定義c函式 因為c函式應當處在c的命名空間中 陸海綿 使用函式指標成員指向乙個類外定義的C函式。extern c class Avoid p int 實在想不到哪種應用場景...

為什麼C 中自定義函式與Linux系統呼叫同簽名,卻仍然可以編譯

H 0214 可以自定義strlen啊。當你include cstring標頭檔案,預處理之後有了有了strlen的宣告 因為你又寫了strlen的定義,所以strlen是本模組定義的符號,在編譯的時候就已經生成了機器碼。鏈結器不會再鏈結庫裡的那個版本。 gcc 在編譯的時候,是有一些 潛規則的 我...