__stdcall
Konvence __stdcall
volání se používá k volání funkcí rozhraní API Win32. Volaný zásobník vyčistí, takže kompilátor dělá vararg
funkce __cdecl
. Funkce, které používají tuto konvenci volání, vyžadují prototyp funkce. __stdcall
Modifikátor je specifický pro Microsoft.
Syntaxe
return-type
__stdcall
function-name[(
argument-list)
]
Poznámky
Následující seznam ukazuje implementaci této konvence volání.
Element (Prvek) | Implementace |
---|---|
Pořadí předávání argumentů | Zprava doleva. |
Konvence předávání argumentů | Podle hodnoty, pokud není předán ukazatel nebo typ odkazu. |
Odpovědnost za údržbu zásobníku | Volané funkce zobrazí vlastní argumenty ze zásobníku. |
Konvence pro vzhled názvu | Podtržítko (_ ) má před název. Za názvem následuje znak at (@ ) následovaný počtem bajtů (v desítkové soustavě) v seznamu argumentů. Proto je funkce deklarována takto int func( int a, double b ) : _func@12 |
Konvence pro posunutí | Žádné |
Možnost kompilátoru /Gz určuje __stdcall
pro všechny funkce, které nejsou explicitně deklarovány s jinou konvencí volání.
Kvůli kompatibilitě s předchozími verzemi _stdcall
je synonymem, pokud __stdcall
není zadána možnost /Za
kompilátoru (Zakázat jazyková rozšíření ).
Funkce deklarované pomocí modifikátoru __stdcall
vrací hodnoty stejným způsobem jako funkce deklarované pomocí __cdecl
.
U procesorů __stdcall
ARM a x64 se kompilátor přijímá a ignoruje. V architekturách ARM a x64 se podle konvence předávají argumenty v registrech, pokud je to možné, a následné argumenty se předávají v zásobníku.
U funkcí nestatické třídy platí, že je-li funkce definovaná mimo řádek, modifikátor konvence volání není nutné určit 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. Vzhledem k této definici třídy,
struct CMyClass {
void __stdcall mymethod();
};
tohoto provozu
void CMyClass::mymethod() { return; }
je ekvivalentní tomuto
void __stdcall CMyClass::mymethod() { return; }
Příklad
V následujícím příkladu se používají výsledky ve všech WINAPI
typech __stdcall
funkcí, které se zpracovávají 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, ...);
Viz také
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro