__stdcall
Microsoft 專有的
__stdcall呼叫慣例用來呼叫 Win32 API 函式。被呼叫端會清除堆疊,所以編譯器進行 vararg 函式__cdecl。使用此呼叫慣例的函式需要函式原型。
return-type __stdcall function-name[(argument-list)]
備註
下列清單會顯示這個呼叫慣例的實作。
項目 |
實作 |
---|---|
傳遞引數的順序 |
由右至左。 |
引數傳遞轉換 |
傳值,除非傳遞為指標或參考型別。 |
堆疊維護責任 |
從堆疊自己的引數呼叫函式的 pop。 |
名稱裝飾慣例 |
名稱有前置底線 (_)。名稱後面跟著小老鼠符號 (@),後面接著的位元組數 (以十進位) 引數清單中。因此,此函式宣告為int func( int a, double b )來裝飾,如下所示:_func@12 |
大小寫轉譯慣例 |
None |
/Gz 編譯器選項指定__stdcall的所有未明確宣告具有不同的呼叫慣例的函式。
使用宣告的函式__stdcall修飾詞的傳回值的函式宣告使用相同的方式來 __cdecl。
在 Itanium 處理器系列 (IPF) 和 x64 處理器, __stdcall加以接受並由編譯器 ; 略過 在 IPF,依照慣例,傳遞參數暫存器中。
對於非靜態類別的函式,函式是定義的出行,如果呼叫慣例修飾詞並沒有指定行超出定義上。也就是類別的非靜態成員方法,在宣告期間指定的呼叫慣例會假設為定義點。此類別定義中,
struct CMyClass {
void __stdcall mymethod();
};
this
void CMyClass::mymethod() { return; }
這等於是
void __stdcall CMyClass::mymethod() { return; }
範例
在下列範例中,使用 __服務繼續操作中的所有郵件會產生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, ...);