在以前老版本的C++編譯器裡,編譯器會為使用不同呼叫約定(Calling Convention)的函式生成不同的名稱,不僅是連線程式會遵從這個命名規則,偵錯程式也會遵守這個命名規則。因此在Visual Studio裡除錯使用老版本編譯器編譯出來的程式,在設定函式斷點的時候需要考慮到這個因素。
下面是VC裡面不同呼叫約定的函式命名規則:
呼叫約定 | 引數壓棧順序 | 清理堆疊 | 函式命名規則 |
stdcall | 從右向左 | 被調函式負責清理堆疊 | 函式名加字首“_”,並且在函式名後面附加“@”和堆疊要求分配的位元組數。
示例:_TestMethod@4 |
Cdecl | 從右向左 | 呼叫函式負責清理堆疊 | 函式名加字首“_”。
示例:_TestMethod |
Fastcall | 前兩個引數由ECX和EDX傳遞,其他的從右向左壓棧 | 被調函式負責清理堆疊 | 函式名後附加“@”和堆疊要求分配的位元組數。
示例:TestMethod@4 |
Thiscall | This指標由ECX暫存器傳遞,其他的從右向左壓棧 | 被調函式負責清理堆疊 | C++命令規則 |