亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C++多態(tài)與虛擬之C++編譯器對(duì)函數(shù)名的改編(Name?Mangling)

 更新時(shí)間:2024年04月27日 09:01:51   作者:阮春義  
在Windows?DLLs中,使用C++編寫的DllMain()等callback函數(shù)需避免C++編譯器進(jìn)行name?mangling,因此需使用extern?"C",這篇文章主要介紹了C++多態(tài)與虛擬:C++編譯器對(duì)函數(shù)名的改編(Name?Mangling),需要的朋友可以參考下

如果函數(shù)名稱都相同(也就是被overloaded),編譯器在面對(duì)你的函數(shù)喚起動(dòng)作時(shí),究竟是如何確定調(diào)用哪個(gè)函數(shù)實(shí)體呢?事實(shí)上,編譯器把所有同名的overloaded functions視為不同的函數(shù),并且以特殊方式對(duì)它們的函數(shù)名稱做了手腳,以四個(gè)Add()函數(shù)為例:

 int Add(int a, int b);
 long Add(long a, long b);
 double Add(double a, double b);
 float Add(float a, float b);

  Visual C++編譯器真正為這四個(gè)函數(shù)所編碼出來的函數(shù)名稱是:

?Add@@YAHHH@Z 
?Add@@YAJJJ@Z
?Add@@YANNN@Z
?Add@@YAMMM@Z

  再以 CPoint 的兩個(gè) x() 為例:

 class CPoint
 { public:
   ...
   float x();
   void x( float xval );
 };

  編譯器真正為它們編出來的函數(shù)名稱是(其中包含class名稱,參數(shù)個(gè)數(shù)和參數(shù)類型):

?x@CPoint@@QAEMXZ
?x@CPoint@@QAEXM@Z

  這樣的“名稱改編”行為稱為“name manging”。讓人遺憾的是,不同編譯器有著不同的name manging作法。這當(dāng)然不好,表示我以Microsoft C++編譯出來的程序沒辦法調(diào)用一個(gè)以Borland C++編譯器完成的函數(shù)。換句話說,函數(shù)的名稱并不存在著binary standard,這就嚴(yán)重影響了software components的發(fā)展。Naming Mangling 不只用于overloaded functions身上,C++程序中所有的global函數(shù)以及classes中的所有members,都會(huì)被施以naming mangling手術(shù)。如果要抑制naming mangling的作用,就必須加上關(guān)鍵字extern“C”以修飾。

  extern "C":對(duì)于程序員來說,通常不需要關(guān)心名稱改編(Name Mangling)這個(gè)問題。但是,當(dāng)你的C++程序需要導(dǎo)出某些功能供其他程序或庫(kù)使用時(shí),名稱改編就會(huì)成為一個(gè)問題。在C++程序中,可以導(dǎo)出的東西主要是函數(shù)和類。雖然也可以導(dǎo)出數(shù)據(jù),但根據(jù)“數(shù)據(jù)封裝”的原則,導(dǎo)出數(shù)據(jù)是非常罕見且應(yīng)該避免的做法。 無論類是否被導(dǎo)出,它們的名稱都會(huì)被改編。但是,對(duì)于函數(shù)來說,當(dāng)我們?cè)噲D導(dǎo)出它們時(shí),我們不希望編譯器對(duì)它們進(jìn)行名稱改編。這是因?yàn)槲覀儾幌M@些函數(shù)的使用者被限制使用“與函數(shù)設(shè)計(jì)者相同的開發(fā)工具”。畢竟,目前各家C++編譯器廠商并沒有協(xié)調(diào)出一個(gè)統(tǒng)一的名稱改編方法。 因此,對(duì)于即將導(dǎo)出的函數(shù),為了抑制名稱改編的作用,我們必須加上特殊的修飾詞`extern "C"`。這樣做可以讓編譯器知道這些函數(shù)應(yīng)該使用C風(fēng)格的鏈接,從而避免名稱改編。這樣,其他語言或庫(kù)就可以正確地調(diào)用這些函數(shù)了。例如:

extern "C" int Add(int a, int b);

  在Windows DLLs中,使用C++編寫的DllMain()等callback函數(shù)需避免C++編譯器進(jìn)行name mangling,因此需使用extern "C"。這樣可以確保函數(shù)名稱和格式固定,便于系統(tǒng)回呼。

extern "C"
int APIENTRY 7 DllMain(HINSTANCE hInst, DWORD dwReason, LPVOID lpReserved)
{
...
}

到此這篇關(guān)于C++多態(tài)與虛擬之C++編譯器對(duì)函數(shù)名的改編(Name Mangling)的文章就介紹到這了,更多相關(guān)C++編譯器對(duì)函數(shù)名的改編內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySQL系列教程之使用C語言來連接數(shù)據(jù)庫(kù)

    MySQL系列教程之使用C語言來連接數(shù)據(jù)庫(kù)

    c語言操作Mysql數(shù)據(jù)庫(kù),主要就是為了實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的增、刪、改、查等操作,下面這篇文章主要給大家介紹了關(guān)于MySQL系列教程之使用C語言來連接數(shù)據(jù)庫(kù)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • C語言深入淺出分析函數(shù)指針

    C語言深入淺出分析函數(shù)指針

    函數(shù)指針是一個(gè)指針變量,它可以存儲(chǔ)函數(shù)的地址,然后使用函數(shù)指針,下面這篇文章主要給大家介紹了關(guān)于C語言進(jìn)階教程之函數(shù)指針的相關(guān)資料,需要的朋友可以參考下
    2022-07-07
  • 用while判斷輸入的數(shù)字是否回文數(shù)的簡(jiǎn)單實(shí)現(xiàn)

    用while判斷輸入的數(shù)字是否回文數(shù)的簡(jiǎn)單實(shí)現(xiàn)

    這篇文章主要介紹了用while判斷輸入的數(shù)字是否回文數(shù)的簡(jiǎn)單實(shí)現(xiàn),需要的朋友可以參考下
    2014-02-02
  • C語言中的浮點(diǎn)數(shù)存儲(chǔ)詳解

    C語言中的浮點(diǎn)數(shù)存儲(chǔ)詳解

    這篇文章主要介紹了C語言中的浮點(diǎn)數(shù)存儲(chǔ)詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • C語言數(shù)據(jù)結(jié)構(gòu)之vector底層實(shí)現(xiàn)機(jī)制解析

    C語言數(shù)據(jù)結(jié)構(gòu)之vector底層實(shí)現(xiàn)機(jī)制解析

    向量(Vector)是一個(gè)封裝了動(dòng)態(tài)大小數(shù)組的順序容器(Sequence?Container)。跟任意其它類型容器一樣,它能夠存放各種類型的對(duì)象。可以簡(jiǎn)單的認(rèn)為,向量是一個(gè)能夠存放任意類型的動(dòng)態(tài)數(shù)組
    2021-11-11
  • C語言構(gòu)建連連看游戲(矩陣方式)

    C語言構(gòu)建連連看游戲(矩陣方式)

    這篇文章主要為大家詳細(xì)介紹了C語言構(gòu)建連連看游戲,采用矩陣方式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • C++文件讀寫代碼分享

    C++文件讀寫代碼分享

    本文給大家分享的是2個(gè)C++實(shí)現(xiàn)文件讀寫的代碼,都非常的簡(jiǎn)單實(shí)用,有需要的小伙伴可以參考下。
    2015-07-07
  • C++ Boost Graph算法超詳細(xì)精講

    C++ Boost Graph算法超詳細(xì)精講

    這篇文章主要介紹了C++ Boost Graph算法,我門嘗試使用Boost.Graph庫(kù)來運(yùn)行Goldberg的最大流算法。 Boost.Graph將其稱為push_relabel_max_flow
    2022-10-10
  • C++中static修飾符的詳解及其作用介紹

    C++中static修飾符的詳解及其作用介紹

    這篇文章主要介紹了C++中static修飾符的詳解及其作用介紹,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-09-09
  • C++設(shè)計(jì)模式之單例模式詳解

    C++設(shè)計(jì)模式之單例模式詳解

    這篇文章主要介紹了C++設(shè)計(jì)模式之單例模式,本文同時(shí)給出了數(shù)種單例模式的實(shí)現(xiàn)代碼,需要的朋友可以參考下,希望能夠給你帶來幫助
    2021-09-09

最新評(píng)論