__thiscall
Microsoft 特定__thiscall
呼叫慣例會用於 x86 結構上的 C++ 類別成員函式。 這是預設呼叫慣例,會由不使用變數引數 (vararg
函式) 的成員函式所使用。
在 __thiscall
下,被呼叫端會清除堆疊,而在 vararg
函式中這是不可能的。 引數會從右至左推送至堆疊。 this
指標會透過暫存器 ECX 傳遞,而不是在堆疊上傳遞。
在 ARM、ARM64 以及 x64 機器上,此編譯器會接受並忽略 __thiscall
。 那是因為其預設會使用以暫存器為基礎的呼叫慣例。
其中一個使用 __thiscall
的理由,是在成員函式預設使用 __clrcall
的類別中。 您可以在這種案例中使用 __thiscall
,讓個別成員函式可從機器碼呼叫。
以 /clr:pure
進行編譯時,除非另行指定,否則所有函式和函式指標都是 __clrcall
。 /clr:pure
和 /clr:safe
編譯器選項在 Visual Studio 2015 中已淘汰,且 Visual Studio 2017 已不支援此選項。
vararg
成員函式使用 __cdecl
呼叫慣例。 所有函式引數都推進堆疊中,其中 this
指標最後推入堆疊。
這個呼叫慣例僅適用於 C++,因此其沒有 C 名稱裝飾配置。
當您在行外定義非靜態類別成員函式時,請只在宣告中指定呼叫慣例修飾元。 您不需要在行外定義上再次指定。 此編譯器會使用在定義時於宣告期間指定的呼叫慣例。
另請參閱
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應