日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

VC的函数修饰名

發布時間:2023/12/18 c/c++ 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 VC的函数修饰名 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
VC 中的修飾名(Decoration name)

“C”或者“C++”函數在內部(編譯和鏈接)通過修飾名識別。修飾名是編譯器在編譯函數定義或者原型時生成的字 符串。有些情況下使用函數的修飾名是必要的,如在模塊定義文件里頭指定輸出“C++”重載函數、構造函數、析構函數,又如在匯編代碼里調用“C””或“C ++”函數等。

修飾名由函數名、類名、調用約定、返回類型、參數等共同決定。

  • 調用約定
  • 調用約定(Calling convention)決定以下內容:函數參數的壓棧順序,由調用者還是被調用者把參數彈出棧,以及產生函數修飾名的方法。MFC支持以下調用約定:

  • _cdecl

    按從右至左的順序壓參數入棧,由調用者把參數彈出棧。對于“C”函數或者變量,修飾名是在函數名前加下劃線。對于“C++”函數,有所不同。

    如函數void test(void)的修飾名是_test;對于不屬于一個類的“C++”全局函數,修飾名是?test@@ZAXXZ。

    這是MFC缺省調用約定。由于是調用者負責把參數彈出棧,所以可以給函數定義個數不定的參數,如printf函數。

  • _stdcall

    按從右至左的順序壓參數入棧,由被調用者把參數彈出棧。對于“C”函數或者變量,修飾名以下劃線為前綴,然后是函數名,然后是符號“@”及參數的字節數,如函數int func(int a, double b)的修飾名是_func@12。對于“C++”函數,則有所不同。

    所有的Win32 API函數都遵循該約定。

  • _fastcall

    頭兩個DWORD類型或者占更少字節的參數被放入ECX和EDX寄存器,其他剩下的參數按從右到左的順序壓入棧。由被調用者把參數彈出棧,對于“C”函數或者變量,修飾名以“@”為前綴,然后是函數名,接著是符號“@”及參數的字節數,如函數int func(int a, double b)的修飾名是@func@12。對于“C++”函數,有所不同。

    未來的編譯器可能使用不同的寄存器來存放參數。

  • thiscall

    僅僅應用于“C++”成員函數。this指針存放于CX寄存器,參數從右到左壓棧。thiscall不是關鍵詞,因此不能被程序員指定。

  • naked call

    采用1-4的調用約定時,如果必要的話,進入函數時編譯器會產生代碼來保存ESI,EDI,EBX,EBP寄存器,退出函數時則產生代碼恢復這些寄存器的內容。naked call不產生這樣的代碼。

    naked call不是類型修飾符,故必須和_declspec共同使用,如下:

    __declspec( naked ) int func( formal_parameters )

    {

    // Function body

    }

  • 過時的調用約定
  • 原來的一些調用約定可以不再使用。它們被定義成調用約定_stdcall或者_cdecl。例如:

    #define CALLBACK __stdcall

    #define WINAPI __stdcall

    #define WINAPIV __cdecl

    #define APIENTRY WINAPI

    #define APIPRIVATE __stdcall

    #define PASCAL __stdcall


    表7-1顯示了一個函數在幾種調用約定下的修飾名(表中的“C++”函數指的是“C++”全局函數,不是成員函數),函數原型是void CALLTYPE test(void),CALLTYPE可以是_cdecl、_fastcall、_stdcall。

    表7-1 不同調用約定下的修飾名

    調用約定

    extern “C”或.C文件

    .cpp, .cxx或/TP編譯開關

    _cdecl

    _test

    ?test@@ZAXXZ

    _fastcall

    @test@0

    ?test@@YIXXZ

    _stdcall

    _test@0

    ?test@@YGXXZ


    總結

    以上是生活随笔為你收集整理的VC的函数修饰名的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。