C 不支援模版的分離式編譯

2021-09-07 21:37:08 字數 765 閱讀 8599

1、c++不支援模版的分離式編譯,為什麼?

c++是分別,單獨編譯,對於每個cpp檔案,預編譯為編譯單元,這個編譯單元是自包含檔案,編譯的時候,不需要其他的檔案,編譯好了,生成obj檔案,然後連線成exe檔案。在編譯的時候,使用乙個東西,如果這個東西就在當前位置,當然好了。如果不再當前位置,也沒關係,只要說,我有這個東西就行,這個東西在其他地方。在連線的時候,會找到這個東西在什麼地方。

考慮普通方法,通過上面的分析,是沒有問題的。考慮模版方法:

fun.h宣告乙個方法模版,fun.cpp包含fun.h,並定義了方法模版,main.cpp包含fun.h,然後使用方法。單獨編譯fun.cpp,並不會生成特定版本的方法,因為c++規定,模版只有在使用的時候,才例項化乙個方法(c++也做不到,因為有太多的型別,難道針對每個型別都例項化乙個方法,顯然不可能)。在main.cpp中,相當於宣告了模版方法,但是不知道模版方法的定義,因此也沒法例項化模版方法,只能希望聯結器在其他的obj檔案中,找到對應的例項化方法。但是在連線的時候,找不到對應的方法,連線錯誤。

2、上面問題的關鍵是:c++單獨,分別編譯。fun.cpp定義了模版方法,但是沒有使用,因此不會例項化模版方法。而在main.cpp中,使用了模版方法,但是不知道模版方法的定義,也沒辦法例項化方法,只能寄希望於連線的時候,從其他obj中找到,當然找不到,就出錯了。

解決的辦法就是:把模版方法的定義也放到標頭檔案中。包含這個標頭檔案,並且使用模版方法,都會例項化乙個對應的方法。這就會導致乙個問題:不同的obj檔案之間,會重複例項化模版方法。這個沒關係,可以認為,連線的時候,只保留乙個。

c 的分離式編譯模式為什麼不支援模版

在我們做c 開發的過程中,通常我們寫乙個類就會有乙個.h和.cpp檔案,當我們需要呼叫乙個函式或者引用乙個變數時我們只需要包含宣告這些函式或者變數的.h檔案即可,當我們編譯c 專案時,每個cpp檔案被編譯成乙個.obj檔案,在這些.obj檔案只包含非本檔案函式的宣告而沒有這些函式的二進位制 當我們呼...

C 分離式編譯

c 開發中廣泛使用宣告和實現分開的開發形式,其編譯過程是分離式編譯,就是說各個cpp檔案完全分開編譯,然後生成各自的obj目標檔案,最後通過鏈結器link生成乙個可執行的exe檔案。不需其他操作。在編譯main.cpp的時候,不需要知道呼叫的其他檔案中的函式的具體實現,只需要有個宣告,然後會有一條c...

判斷支不支援分離編譯

為什麼模板不支援分離編譯?什麼時候會出現連線錯誤?如果是普通函式在乙個.cpp檔案中申明,在另外乙個.cpp檔案中定義時,是可以編譯且鏈結的,但是當不存在定義時,會出現連線錯誤。我們具體來分析這類的問題吧 鏈結就是把main.obj與array.obj合成.exe檔案,當鏈結找不到函式入口的時候就會...