共用方式為


__fastcall

Microsoft 特定的

__fastcall 呼叫慣例會指定函式的引數應該盡可能在暫存器中傳遞。 這個呼叫慣例僅適用於 x86 架構。 下列清單會顯示這個呼叫慣例的實作。

元素

實作

引數傳遞順序

引數清單中的前兩個 DWORD 引數或較小引數會由左至右傳入 ECX 和 EDX 暫存器,所有其他引數則由右至左傳遞至堆疊上。

堆疊維護責任

所呼叫的函式會從堆疊取出引數。

名稱裝飾慣例

名稱前面會加上 @ 符號,而參數清單中後面接著位元組數 (十進位) 的 @ 符號會加在名稱後面。

大小寫轉譯慣例

未執行大小寫轉譯。

注意事項注意事項

未來的編譯器版本可能會使用不同的暫存器來儲存參數。

除非函式是使用衝突的屬性宣告,或函式的名稱為 main,否則使用 /Gr 編譯器選項會導致模組中的每個函式編譯為 __fastcall。

目標為 ARM 和 x64 架構的編譯器會接受並忽略 __fastcall 關鍵字,而按照慣例,在 x64 晶片上的前四個引數會傳入暫存器 (可能的話),其他引數則會傳遞至堆疊上。 如需詳細資訊,請參閱 x64 呼叫慣例概觀。 在 ARM 晶片上,最多可以在暫存器中傳遞四個整數引數和八個浮點引數,而其他引數則是在堆疊上傳遞。

對於非靜態類別函式,如果函式是以非正規的方式定義,則不需要在非正規定義上指定呼叫慣例修飾詞。 也就是說,對於類別非靜態成員方法而言,宣告時所指定的呼叫慣例是在定義時假設。 如果已指定此類別定義:

struct CMyClass {
   void __fastcall mymethod();
};

這個:

void CMyClass::mymethod() { return; }

相當於這個:

void __fastcall CMyClass::mymethod() { return; }

範例

下列範例會對暫存器中的 DeleteAggrWrapper 函式傳遞引數:

// Example of the __fastcall keyword
#define FASTCALL    __fastcall
   
void FASTCALL DeleteAggrWrapper(void* pWrapper);
// Example of the __ fastcall keyword on function pointer
typedef BOOL (__fastcall *funcname_ptr)(void * arg1, const char * arg2, DWORD flags, ...);

請參閱

參考

引數傳遞和命名慣例

C++ 關鍵字