__stdcall
Specifické pro Microsoft
Konvence volání __stdcall je použita k volání funkce rozhraní Win32 API.Volaný vyčistí zásobník, aby mohl kompilátor provést u vararg funkce __cdecl.Funkce, které používají konvenci volání k vyžadování prototypu funkce.
return-type __stdcall function-name[(argument-list)]
Poznámky
Následující seznam ukazuje implementaci této konvence volání.
Element |
Implementace |
---|---|
Pořadí předávání argumentů |
Zprava doleva. |
Konvence předávání argumentů |
Podle hodnoty, pokud je předán typ ukazatele nebo odkazu. |
Odpovědnost za údržbu zásobníku |
Volaná funkce vezme argumenty ze zásobníku. |
Konvence pro vzhled názvu |
Podtržítko (_) je součástí předpony názvu.Následuje je zakončen symbolem (@) následovaným počtem bajtů (v desítkové soustavě) v seznamu argumentů.Proto je funkce deklarovaná jako int func( int a, double b ) upravena takto: _func@12 |
Úmluva překladu případu |
Žádná |
Možnost kompilátoru /Gz určuje __stdcall pro všechny funkce, které nejsou explicitně deklarovány pomocí jiné konvence volání.
Funkce, které jsou deklarovány pomocí modifikátoru __stdcall se vrátí stejným způsobem jako funkce, které jsou deklarovány pomocí __cdecl.
Na procesorech ARM a x64 je klíčové slovo __stdcall přijato a ignorováno kompilátory; v architekturách ARM a x64 jsou podle úmluvy argumenty předány v registrech, pokud je to možné, a další argumenty jsou předány do zásobníku.
U funkcí nestatické třídy je-li funkce definovaná mimo řádek, volající konvenční modifikátor nemusí být stanoven na definici mimo řádek.To znamená, že pro členské nestatické metody třídy se konvence volání zadaná během deklarace přejme během definice.Při této definici třídy,
struct CMyClass {
void __stdcall mymethod();
};
toto
void CMyClass::mymethod() { return; }
je ekvivalentem tohoto
void __stdcall CMyClass::mymethod() { return; }
Příklad
V následujícím příkladu má použití __stdcall za následek zpracování všech typů funkcí WINAPI jako standardní volání:
// 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, ...);