欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解C++函數(shù)模板與分離編譯模式

 更新時間:2020年08月12日 08:58:15   作者:Dabelv  
這篇文章主要介紹了詳解C++函數(shù)模板與分離編譯模式的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)c++,感興趣的朋友可以了解下

1.分離編譯模式

一個程序(項目)由若干個源文件共同實現(xiàn),而每個源文件單獨編譯生成目標文件,最后將所有目標文件連接起來形成單一的可執(zhí)行文件的過程稱為分離編譯模式。

2.使用函數(shù)模板在鏈接時出錯

在C++程序設(shè)計中,在一個源文件中定義某個函數(shù),然后在另一個源文件中使用該函數(shù),這是一種非常普遍的做法。但是,如果定義和調(diào)用一個函數(shù)模板時也采用這種方式,會發(fā)生編譯錯誤。

下面的程序由三個文件組成:func.h用來對函數(shù)模板進行申明,func.cpp用來定義函數(shù)模板,main.cpp包含func.h頭文件并調(diào)用相應(yīng)的函數(shù)模板。

/***func.h***/
template<class T> void func(const T&);
/***end func.h***/

/***func.cpp***/
#include <iostream>
using namespace std;

#include "func.h"
template<class T> void func(const T& t)
{
 cout<<t<<endl;
}
/***end func.cpp***/

/***main.cpp***/
#include <stdio.h>
#include "func.h"

int main()
{
 func(3);
}
/***end main.cpp***/

這是一個結(jié)構(gòu)非常清晰的程序,但是它不能通過編譯。在VS2017下的出錯信息是:

error LNK2019: 無法解析的外部符號 "void __cdecl func< int>(int const &)" (??$func@H@@YAXABH@Z)

原因出現(xiàn)在分離編譯模式上。在分離編譯模式下,func.cpp會生成一個目標文件為func.obj,由于在func.cpp文件中,并沒有發(fā)生函數(shù)模板調(diào)用,所以不會將函數(shù)模板func<T>實例化為模板函數(shù)func<int>,也就是說,在func.obj中無法找到關(guān)于模板函數(shù)func<int>的實現(xiàn)代碼。在源文件main.cpp中,雖然函數(shù)模板被調(diào)用,但由于沒有模板代碼,也不能將其實例化。也就是說,在main.obj中也找不到模板函數(shù)func<int>的實現(xiàn)代碼。這樣,在鏈接的時候就會出現(xiàn)func<int>沒有定義的錯誤。

3.解決辦法

3.1將函數(shù)模板的定義放到頭文件

一個簡單的解決辦法就是將函數(shù)模板func<T>的定義寫到頭文件func.h中。這樣的話,只要包含了這個頭文件,就會把函數(shù)模板的代碼包含進來,一旦發(fā)生函數(shù)調(diào)用,就可以依據(jù)函數(shù)模板代碼將其實例化。這個辦法雖然簡單可行,但是有如下不足。
 (1)函數(shù)模板的定義寫進了頭文件,暴露了函數(shù)模板的實現(xiàn)細節(jié)。
 (2)不符合分離編譯模式的規(guī)則,因為分離編譯模式要求函數(shù)原型申明放在頭文件,定義放在源文件。

注意: 這樣做,如果在多個目標文件中存在相同的函數(shù)模板實例化后的模板函數(shù)實體,鏈接時并不會報函數(shù)重定義的錯誤,這與普通函數(shù)不同,因為編譯器會對實例化后的重復(fù)的模板函數(shù)實體進行優(yōu)化,只保留一份代碼實體。如果不同的源文件中都保留一份函數(shù)模板實體,會造成代碼冗余,實際上,這也是一種代碼冗余的解決辦法。

3.2仍然采用分離編譯模式

有什么辦法可以讓函數(shù)模板實例化時能夠找到相應(yīng)的模板函數(shù)的代碼呢?一個可能的解決辦法就是使用關(guān)鍵字export。也就是說,在func.cpp里定義函數(shù)模板的時候,將函數(shù)模板頭寫成:

export template<class T> void func(const T& t);

這樣做的目的是告訴編譯器,這個函數(shù)模板可能再其他源文件中被實例化。這是一個對程序員來說負擔(dān)最輕的解決辦法,但是,目前幾乎所有的編譯器都不支持關(guān)鍵字export,包括VC++和GNU C++。

3.3顯示實例化

顯示實例化也稱為外部實例化。在不發(fā)生函數(shù)調(diào)用的時候?qū)⒑瘮?shù)模板實例化,或者在不使用類模板的時候?qū)㈩惸0鍖嵗Q之為模板顯示實例化。

上面遇到的問題是main.obj和func.obj中找不到模板函數(shù)func<int>的實現(xiàn)代碼,那么就在func.cpp中將函數(shù)模板func<T>顯示實例化為模板函數(shù)func<int>。

template void func<int>(const int&); //函數(shù)模板顯示實例化

這樣,就可以在func.cpp產(chǎn)生模板函數(shù)func<int>的實例化代碼,編譯之后就會產(chǎn)生函數(shù)的二進制代碼,供其它源文件鏈接,程序就可以正常運行。當類模板的成員函數(shù)的實現(xiàn)定義在源文件中,通過模板類的對象調(diào)用成員函數(shù)時也會出現(xiàn)找不到函數(shù)定義的錯誤,可以使用同樣的方法解決,不再贅述。

以上就是詳解C++函數(shù)模板與分離編譯模式的詳細內(nèi)容,更多關(guān)于C++函數(shù)模板與分離編譯模式的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C++圖書管理系統(tǒng)程序源代碼

    C++圖書管理系統(tǒng)程序源代碼

    這篇文章主要為大家詳細介紹了C++圖書管理系統(tǒng)程序源代碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C++逆向分析移除鏈表元素實現(xiàn)方法詳解

    C++逆向分析移除鏈表元素實現(xiàn)方法詳解

    這篇文章主要介紹了C++實現(xiàn)LeetCode(203.移除鏈表元素),本篇文章通過逆向分析的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2022-11-11
  • 使用C++實現(xiàn)迷宮游戲

    使用C++實現(xiàn)迷宮游戲

    這篇文章主要為大家詳細介紹了C++實現(xiàn)迷宮游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • C++ 結(jié)構(gòu)體初始化與賦值詳解

    C++ 結(jié)構(gòu)體初始化與賦值詳解

    本文主要介紹了C++ 結(jié)構(gòu)體初始化與賦值詳解,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • C語言內(nèi)存的動態(tài)分配比較malloc和realloc的區(qū)別

    C語言內(nèi)存的動態(tài)分配比較malloc和realloc的區(qū)別

    這篇文章主要介紹了C語言內(nèi)存的動態(tài)分配比較malloc和realloc的區(qū)別,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是本文的詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • 詳解如何在VS2019和VScode中配置C++調(diào)用python接口

    詳解如何在VS2019和VScode中配置C++調(diào)用python接口

    這篇文章主要介紹了詳解如何在VS2019和VScode中配置C++調(diào)用python接口,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • 深入剖析C語言中qsort函數(shù)的實現(xiàn)原理

    深入剖析C語言中qsort函數(shù)的實現(xiàn)原理

    這篇文章主要介紹了C語言中qsort函數(shù)的實現(xiàn)原理,本文將從回調(diào)函數(shù),qsort函數(shù)的應(yīng)用,qsort函數(shù)的實現(xiàn)原理三個方面進行講解,并通過代碼示例講解的非常詳細,需要的朋友可以參考下
    2024-03-03
  • 詳解C++虛函數(shù)的工作原理

    詳解C++虛函數(shù)的工作原理

    這篇文章主要介紹了C++虛函數(shù)的工作原理的的相關(guān)資料,文中講解非常細致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • c++11&14-多線程要點匯總

    c++11&14-多線程要點匯總

    這篇文章主要介紹了c++11&14-多線程的使用方法,文中代碼非常詳細,方便大家更好的參考和學(xué)習(xí),感興趣的朋友快來了解下
    2020-06-06
  • 全排列算法的原理和實現(xiàn)代碼

    全排列算法的原理和實現(xiàn)代碼

    這篇文章主要介紹了全排列算法的原理和實現(xiàn)代碼,全排列是將一組數(shù)按一定順序進行排列,如果這組數(shù)有n個,那么全排列數(shù)為n!個,需要的朋友可以參考下
    2014-08-08

最新評論