引數傳遞和命名慣例
Microsoft 特定的
Microsoft C++ 編譯器可讓您指定在函式和呼叫端之間傳遞引數和傳回值的慣例。 並非所有慣例都適用於所有支援的平台,部分慣例會使用平台特定實作。 在大部分情況下,會忽略在特定平台上指定不支援慣例的關鍵字或編譯器參數,並且使用平台預設慣例。
在 x86 平臺上,所有引數都會在傳遞時擴大為 32 位。 傳回值也會被擴大為 32 位元並在 EAX 暫存器中傳回,但 8 位元組結構例外,它是在 EDX:EAX 暫存器組中傳回。 較大的結構會在 EAX 暫存器中以隱藏傳回結構的指標傳回。 參數會從右至左推送至堆疊。 非 POD 的結構不會在暫存器中傳回。
如果在函式中使用 ESI、EDI、EBX 和 EBP 暫存器,編譯器會產生初構和終解程式碼來儲存和還原這些暫存器。
注意
從函式以傳值方式傳回結構、等位或類別時,類型的所有定義必須相同,否則程式可能會在執行階段失敗。
如需如何定義您自己的函式初構和表文程式碼的資訊,請參閱 Naked 函式呼叫 。
如需以 x64 平臺為目標之程式碼中預設呼叫慣例的詳細資訊,請參閱 x64 呼叫慣例 。 如需以 ARM 平臺為目標之程式碼中呼叫慣例問題的資訊,請參閱 常見的 Visual C++ ARM 移轉問題 。
Visual C/C++ 編譯器支援下列呼叫慣例。
關鍵字 | 堆疊清除 | 參數傳遞 |
---|---|---|
__cdecl | 呼叫端 | 以相反順序 (從右至左) 將參數推送至堆疊 |
__clrcall | n/a | 依照順序 (從左至右) 將參數載入至 CLR 運算式堆疊。 |
__stdcall | 被呼叫端 | 以相反順序 (從右至左) 將參數推送至堆疊 |
__fastcall | 被呼叫端 | 儲存在暫存器中,然後推送至堆疊 |
__thiscall | 被呼叫端 | 推送到堆疊上; this 儲存在 ECX 中的指標 |
__vectorcall | 被呼叫端 | 儲存在暫存器中,然後以相反順序 (從右至左) 推送至堆疊 |
如需相關資訊,請參閱 過時的呼叫慣例 。
END Microsoft 特定的
另請參閱
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應