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

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

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

如果函數(shù)名稱都相同(也就是被overloaded),編譯器在面對你的函數(shù)喚起動作時,究竟是如何確定調(diào)用哪個函數(shù)實體呢?事實上,編譯器把所有同名的overloaded functions視為不同的函數(shù),并且以特殊方式對它們的函數(shù)名稱做了手腳,以四個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++編譯器真正為這四個函數(shù)所編碼出來的函數(shù)名稱是:

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

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

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

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

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

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

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

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

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

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

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

相關文章

  • C++頭文件和cpp文件的原理分析

    C++頭文件和cpp文件的原理分析

    這篇文章主要介紹了C++頭文件和cpp文件的原理分析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • C++ Boost多線程和并發(fā)教程分享

    C++ Boost多線程和并發(fā)教程分享

    這篇文章主要介紹了C++ Boost多線程和并發(fā)教程,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2026-05-05
  • 快速模式匹配算法(KMP)的深入理解

    快速模式匹配算法(KMP)的深入理解

    本篇文章是對快速模式匹配算法(KMP)進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • C語言嵌入式實現(xiàn)支持浮點輸出的printf示例詳解

    C語言嵌入式實現(xiàn)支持浮點輸出的printf示例詳解

    這篇文章主要為大家介紹了C語言嵌入式實現(xiàn)支持浮點輸出的printf示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • Qt拖放操作和打印操作的實現(xiàn)

    Qt拖放操作和打印操作的實現(xiàn)

    本文主要介紹了Qt拖放操作和打印操作的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • Qt中布局管理的使用小結(jié)

    Qt中布局管理的使用小結(jié)

    Qt的布局管理系統(tǒng)提供了簡單而強大的機制,確保它們有效地使用空間,本文就介紹了Qt中布局管理的使用,具有一定的參考價值,感興趣的可以了解一下
    2023-09-09
  • C語言實現(xiàn)雙向鏈表

    C語言實現(xiàn)雙向鏈表

    本文給大家分享的是一段使用C語言實現(xiàn)雙向鏈表的代碼,完全是根據(jù)自己的理解和認識來編寫的,希望大家能夠喜歡,文章的最后附上了一個網(wǎng)友寫的對于雙向鏈表刪除節(jié)點、插入節(jié)點、雙向輸出等操作的代碼,也非常不錯,推薦給大家
    2015-03-03
  • C++ 類的靜態(tài)成員深入解析

    C++ 類的靜態(tài)成員深入解析

    在C++中類的靜態(tài)成員變量和靜態(tài)成員函數(shù)是個容易出錯的地方,本文先通過幾個例子來總結(jié)靜態(tài)成員變量和成員函數(shù)使用規(guī)則,再給出一個實例來加深印象
    2013-09-09
  • C++實現(xiàn)一個簡單消息隊列的示例詳解

    C++實現(xiàn)一個簡單消息隊列的示例詳解

    消息隊列在多線程的場景有時會用到,尤其是線程通信跨線程調(diào)用的時候,就可以使用消息隊列進行通信。本文將利用C++實現(xiàn)一個簡單的消息隊列,感興趣的可以了解一下
    2022-12-12
  • C++類和對象實戰(zhàn)之Date類的實現(xiàn)方法

    C++類和對象實戰(zhàn)之Date類的實現(xiàn)方法

    C++ 標準庫沒有提供所謂的日期類型,C++ 繼承了C語言用于日期和時間操作的結(jié)構(gòu)和函數(shù),這篇文章主要給大家介紹了C++類和對象實戰(zhàn)之Date類的實現(xiàn)方法,需要的朋友可以參考下
    2021-12-12

最新評論

大方县| 砚山县| 正蓝旗| 东宁县| 和平区| 卫辉市| 且末县| 东乌珠穆沁旗| 托里县| 衡阳市| 长岭县| 内乡县| 基隆市| 焦作市| 古丈县| 塘沽区| 东港市| 乌兰浩特市| 东港市| 梨树县| 乌拉特前旗| 玛纳斯县| 秦皇岛市| 保德县| 南溪县| 上栗县| 宝山区| 元氏县| 社旗县| 上蔡县| 常山县| 三都| 车致| 民勤县| 新龙县| 双城市| 兴义市| 镇沅| 赣榆县| 鲁山县| 合江县|