__stdcall
Specyficzne dla firmy Microsoft
Konwencja wywoływania __stdcall służy do wywoływania funkcji Win32 API.Wywoływany obiekt czyści stos, co sprawia, że kompilator tworzy funkcje vararg__cdecl.Funkcje korzystające z tej konwencja wywoływania wymagają prototypu funkcji.
return-type __stdcall function-name[(argument-list)]
Uwagi
Na poniższej liście przedstawiono implementację niniejszej konwencji wywoływania.
Element |
Implementacja |
---|---|
Kolejność przekazywania argumentów |
Od prawej do lewej. |
Konwencji przekazywania argumentów |
Według wartości, chyba że przekazany jest typ wskaźnika lub odwołania. |
Odpowiedzialność za utrzymanie stosu |
Wywołana funkcja wyciąga argumenty ze stosu. |
Konwencja dekorowania nazw |
Podkreślenie (_) poprzedza nazwę.Za nazwą następuje znak (@) a za nim liczba bajtów (w zapisie dziesiętnym) na liście argumentów.W związku z tym, funkcja zadeklarowana jako int func( int a, double b ) jest oznaczona: _func@12 |
Tłumaczenie przypadku konwencji |
Brak |
Opcja kompilatora /Gz określa __stdcall dla wszystkich funkcji, które nie zostały jawnie zadeklarowane z inną konwencją wywoływania.
Funkcje zadeklarowane za pomocą modyfikatora __stdcall zwracają wartości w taki sam sposób jak funkcje zadeklarowane za pomocą specyfikatora __cdecl.
W procesorach ARM i x64 __stdcall jest akceptowane i ignorowane przez kompilator; w przypadku architektur ARM i x64 według konwencji argumenty są przekazywane do rejestrów, gdy jest to możliwe, a następne argumenty są przekazywane na stosie.
W przypadku funkcji niestatycznych klas, jeśli funkcja jest zdefiniowana poza wierszem, modyfikator konwencji wywołania nie musi być określony w definicji poza wierszem.Oznacza to, że dla metod niestatycznego członka klasy przyjmowana jest konwencja wywołania określona podczas zgłoszenia w punkcie definicji.Biorąc pod uwagę tę definicję klasy,
struct CMyClass {
void __stdcall mymethod();
};
to
void CMyClass::mymethod() { return; }
jest równoważne do
void __stdcall CMyClass::mymethod() { return; }
Przykład
W poniższym przykładzie użycie konwencji __stdcall spowoduje, że wszystkie typy funkcji WINAPI są traktowane jako standardowe wywołanie:
// 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, ...);