首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

C++ 調用約定與名字修飾完整指南 (__cdecl/__stdcall/__fastcall/thiscall)

     編輯:C++ 入門

什麼是調用約定?

調用約定規定了函數調用時:參數入棧順序、棧由誰清理、函數名修飾規則。Visual Studio 默認為 __cdecl,可在項目屬性 C/C++ → Advanced → Calling Convention 修改。

三大主流調用約定對比 (x86)

特性__cdecl (C/C++ 默認)__stdcall (WinAPI)__fastcall
參數入棧順序右→左右→左前兩個 32-bit 參數進 ECX/EDX,其餘右→左入棧
棧清理者調用者被調用者被調用者
修飾名格式 (匯編)_func_func@n (n=參數字節數)@func@n
適用場景可變參函數 (printf)Windows API、DLL 導出性能敏感、參數少
編譯選項/Gd/Gz/Gr

C++ 專屬:thiscall

  • 非靜態成員函數默認約定。
  • this 指針通過 ECX 傳遞,其餘參數右→左入棧。
  • 棧由被調用者清理。
  • 若成員函數為可變參數,則退化為 __cdecl。

C++ 名字修飾規則 (MSVC)

格式:?函數名@@修飾符。修飾符編碼了約定、返回類型、參數類型、cv 資格、類作用域等。

類型代碼含義
Xvoid
D/Echar / unsigned char
F/Hshort / int
I/J/Kunsigned int / long / unsigned long
M/Nfloat / double
_Nbool
PA...指針 (後跟被指類型代碼)

示例

// __stdcall int Test1(char*, unsigned long)
?Test1@@YGHPADK@Z
// __cdecl void Test2()
?Test2@@YAXXZ

規則差異僅在修飾符前綴:
__stdcall: @@YG | __cdecl: @@YA | __fastcall: @@YI

extern "C" 與 .c 文件

禁用 C++ 修飾,生成 C 風格符號 (如 _Test1@8),便於 C/C++ 混合編程及 DLL 導出。

DLL 內存模型補充

  • DLL 映射到調用進程虛擬地址空間,共享進程堆/棧。
  • 每個進程擁有 DLL 全局變量的獨立副本。
  • 線程間共享同一進程的 DLL 數據需同步;若需線程局部存儲,使用 TLS。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved