最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

1.分離編譯模式

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

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

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

下面的程序由三個(gè)文件組成:func.h用來對(duì)函數(shù)模板進(jìn)行申明,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***/

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

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

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

3.解決辦法

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

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

注意: 這樣做,如果在多個(gè)目標(biāo)文件中存在相同的函數(shù)模板實(shí)例化后的模板函數(shù)實(shí)體,鏈接時(shí)并不會(huì)報(bào)函數(shù)重定義的錯(cuò)誤,這與普通函數(shù)不同,因?yàn)榫幾g器會(huì)對(duì)實(shí)例化后的重復(fù)的模板函數(shù)實(shí)體進(jìn)行優(yōu)化,只保留一份代碼實(shí)體。如果不同的源文件中都保留一份函數(shù)模板實(shí)體,會(huì)造成代碼冗余,實(shí)際上,這也是一種代碼冗余的解決辦法。

3.2仍然采用分離編譯模式

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

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

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

3.3顯示實(shí)例化

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

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

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

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

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

相關(guān)文章

  • 一文詳解Qt的QObject類

    一文詳解Qt的QObject類

    Qt的QObject類是Qt框架中的基類,它是所有Qt對(duì)象的父類,本文主要介紹了Qt的QObject類,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-09-09
  • C++ 的 format 和 vformat 函數(shù)示例詳解

    C++ 的 format 和 vformat 函數(shù)示例詳解

    傳統(tǒng)C庫的printf系列函數(shù)存在安全問題,而C++推薦的基于流格式化輸入輸出雖然解決了安全性問題,但在易用性方面仍顯不足,C++11引入了新的C風(fēng)格字符串格式化函數(shù),但類型安全問題依舊存在,下面通過本文介紹C++ 的 format 和 vformat 函數(shù)示例,感興趣的朋友一起看看吧
    2025-02-02
  • C++中輸入輸出流及文件流操作總結(jié)

    C++中輸入輸出流及文件流操作總結(jié)

    這篇文章主要為大家總結(jié)了C++中輸入輸出流及文件流操作,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • 詳解設(shè)計(jì)模式中的Command命令模式及相關(guān)C++實(shí)現(xiàn)

    詳解設(shè)計(jì)模式中的Command命令模式及相關(guān)C++實(shí)現(xiàn)

    這篇文章主要介紹了詳解設(shè)計(jì)模式中的Command命令模式及相關(guān)C++實(shí)現(xiàn),命令模式強(qiáng)調(diào)調(diào)用操作的對(duì)象和操作的具體實(shí)現(xiàn)者之間的解耦,需要的朋友可以參考下
    2016-03-03
  • C++ 字符串去重排序?qū)嵗a

    C++ 字符串去重排序?qū)嵗a

    這篇文章主要介紹了C++ 字符串去重排序?qū)嵗a的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • C++示例講解vector容器

    C++示例講解vector容器

    這篇文章主要介紹了C++?容器?Vector?的使用方法,Vector?是一個(gè)能夠存放任意類型的動(dòng)態(tài)數(shù)組,有點(diǎn)類似數(shù)組,是一個(gè)連續(xù)地址空間,下文更多詳細(xì)內(nèi)容的介紹,需要的小伙伴可以參考一下
    2022-07-07
  • Visual Studio C++指針靠前靠后的問題全面解析

    Visual Studio C++指針靠前靠后的問題全面解析

    這篇文章主要介紹了Visual Studio C++指針靠前靠后的問題全面解析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • C++ opencv霍夫圓檢測(cè)使用案例詳解

    C++ opencv霍夫圓檢測(cè)使用案例詳解

    這篇文章主要介紹了C++ opencv霍夫圓檢測(cè)使用案例詳解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • 深入解析C++中的引用類型

    深入解析C++中的引用類型

    引用指的是對(duì)一個(gè)對(duì)象的引用。那么什么是對(duì)象?在c++中狹義的對(duì)象指的是用類,結(jié)構(gòu),聯(lián)合等復(fù)雜數(shù)據(jù)類型來聲明的變量,如 MyClass myclass,CDialog mydlg,等等
    2013-09-09
  • C++編寫的WebSocket服務(wù)端客戶端實(shí)現(xiàn)示例代碼

    C++編寫的WebSocket服務(wù)端客戶端實(shí)現(xiàn)示例代碼

    本文主要介紹了C++編寫的WebSocket服務(wù)端客戶端實(shí)現(xiàn)示例代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10

最新評(píng)論

九龙城区| 招远市| 怀安县| 西安市| 鱼台县| 微博| 娄烦县| 吕梁市| 浑源县| 健康| 共和县| 塔河县| 峨边| 扶余县| 隆林| 平安县| 怀安县| 福贡县| 和政县| 通州区| 徐闻县| 临武县| 西华县| 望都县| 百色市| 鄂伦春自治旗| 南宁市| 洪江市| 黄骅市| 祁东县| 沧州市| 连州市| 古田县| 镇雄县| 陈巴尔虎旗| 祁连县| 浦东新区| 清镇市| 西城区| 张家港市| 陕西省|