調用約定規定了函數調用時:參數入棧順序、棧由誰清理、函數名修飾規則。Visual Studio 默認為 __cdecl,可在項目屬性 C/C++ → Advanced → Calling Convention 修改。
| 特性 | __cdecl (C/C++ 默認) | __stdcall (WinAPI) | __fastcall |
|---|---|---|---|
| 參數入棧順序 | 右→左 | 右→左 | 前兩個 32-bit 參數進 ECX/EDX,其餘右→左入棧 |
| 棧清理者 | 調用者 | 被調用者 | 被調用者 |
| 修飾名格式 (匯編) | _func | _func@n (n=參數字節數) | @func@n |
| 適用場景 | 可變參函數 (printf) | Windows API、DLL 導出 | 性能敏感、參數少 |
| 編譯選項 | /Gd | /Gz | /Gr |
this 指針通過 ECX 傳遞,其餘參數右→左入棧。__cdecl。格式:?函數名@@修飾符。修飾符編碼了約定、返回類型、參數類型、cv 資格、類作用域等。
| 類型代碼 | 含義 |
|---|---|
| X | void |
| D/E | char / unsigned char |
| F/H | short / int |
| I/J/K | unsigned int / long / unsigned long |
| M/N | float / double |
| _N | bool |
| PA... | 指針 (後跟被指類型代碼) |
// __stdcall int Test1(char*, unsigned long) ?Test1@@YGHPADK@Z // __cdecl void Test2() ?Test2@@YAXXZ
規則差異僅在修飾符前綴:
__stdcall: @@YG | __cdecl: @@YA | __fastcall: @@YI
禁用 C++ 修飾,生成 C 風格符號 (如 _Test1@8),便於 C/C++ 混合編程及 DLL 導出。