__stdcall
呼叫 __stdcall
慣例是用來呼叫 WIN32 API 函式。 被呼叫端會清除堆疊,因此編譯器會建立 vararg
函式 __cdecl
。 使用這個呼叫慣例的函式需要函式原型。 修飾 __stdcall
詞是 Microsoft 特定的。
語法
return-type
__stdcall
function-name [(
argument-list)
]
備註
下列清單會顯示這個呼叫慣例的實作。
元素 | 實作 |
---|---|
引數傳遞順序 | 由右至左。 |
引數傳遞慣例 | 以傳值方式,除非傳遞指標或參考類型。 |
堆疊維護責任 | 被呼叫函式會從堆疊快顯其本身的引數。 |
名稱裝飾慣例 | 底線 ( _ ) 前面會加上名稱。 名稱後面接著 at 符號 ( @ ),後面接著引數清單中的位元組數(以十進位為單位)。 因此,宣告為 int func( int a, double b ) 的函式會裝飾為如下:_func@12 |
大小寫轉譯慣例 | 無 |
/Gz 編譯器選項會 __stdcall
針對未以不同呼叫慣例明確宣告的所有函式指定。
為了與舊版相容, _stdcall
除非指定編譯器選項 /Za
(停用語言延伸模組), 否則 是 的 __stdcall
同義字。
使用 修飾詞宣告的 __stdcall
函式會傳回值,與使用 __cdecl
宣告的函式相同。
在 ARM 和 x64 處理器上, __stdcall
編譯器會接受並忽略;根據慣例,ARM 和 x64 架構上的引數會盡可能傳入暫存器,並在堆疊上傳遞後續的引數。
對於非靜態類別函式,如果函式是以非正規的方式定義,則不需要在非正規定義上指定呼叫慣例修飾詞。 也就是說,對於類別非靜態成員方法而言,宣告時所指定的呼叫慣例是在定義時假設。 如果已指定此類別定義,
struct CMyClass {
void __stdcall mymethod();
};
this
void CMyClass::mymethod() { return; }
相當於這個
void __stdcall CMyClass::mymethod() { return; }
範例
在下列範例中,將 __stdcall
結果用於處理為標準呼叫的所有 WINAPI
函式類型:
// Example of the __stdcall keyword
#define WINAPI __stdcall
// Example of the __stdcall keyword on function pointer
typedef BOOL (__stdcall *funcname_ptr)(void * arg1, const char * arg2, DWORD flags, ...);
另請參閱
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應