Sdílet prostřednictvím


__cdecl

Specifické pro Microsoft

__cdecl je výchozí konvencí volání programů jazyka C a C++.Vzhledem k tomu, že je zásobník vyčištěn volajícím, můžete provádět funkce vararg.Konvence volání __cdecl vytvoří větší spustitelné soubory než konvence _stdcall, protože vyžaduje, aby každé volání funkce obsahovalo kód pro vyčištění zásobníku.Následující seznam ukazuje implementaci této konvence volání.

Prvek

Implementace

Pořadí předávání argumentů

Zprava doleva.

Odpovědnost za údržbu zásobníku

Volání funkce vezme argumenty ze zásobníku (POP).

Konvence pro vzhled názvu

Znak podtržítka (_) je předponou názvů, s výjimkou exportu funkcí __cdecl, které používají navázání C.

Konvence pro posunutí

Neprovádí se žádné posunutí.

[!POZNÁMKA]

Související informace naleznete v tématu Dekorované názvy.

Umístěte modifikátor __cdecl před proměnnou nebo název funkce.Protože konvence pojmenování a volání jazyka C jsou standardem, jediný případ, kdy je třeba použít konvenci __cdecl v kódu x86, je pokud jste určili možnost kompilátoru /Gv (vectorcall), /Gz (stdcall) nebo /Gr (fastcall).Možnost kompilátoru /Gd vynutí konvenci volání __cdecl.

U procesorů ARM a x64 kompilátor __cdecl přijme, ale obvykle ignoruje.Podle konvence pro procesory ARM a x64 jsou argumenty předávány v registrech vždy, když je to možné, a následné argumenty jsou předávány na zásobníku.V kódu x64 použijte __cdecl k potlačení možnosti kompilátoru /Gv a použijte výchozí konvenci volání pro x64.

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.Při této definici třídy:

struct CMyClass {
   void __cdecl mymethod();
};

toto:

void CMyClass::mymethod() { return; }

je ekvivalentem tohoto:

void __cdecl CMyClass::mymethod() { return; }

Příklad

V následujícím příkladu je kompilátor nastaven na použití konvencí volání a názvů jazyka C pro funkci system.

// Example of the __cdecl keyword on function
int __cdecl system(const char *);
// Example of the __cdecl keyword on function pointer
typedef BOOL (__cdecl *funcname_ptr)(void * arg1, const char * arg2, DWORD flags, ...);

Viz také

Referenční dokumentace

Konvence předávání a pojmenování argumentů

Klíčová slova jazyka C++