Udostępnij za pośrednictwem


__cdecl

Specyficzne dla firmy Microsoft

__cdecl to domyślna konwencja wywołania dla programów C i C++.Ponieważ stos jest czyszczony przez obiekt wywołujący, może to wykonać funkcje vararg.Konwencja wywoływania __cdecl tworzy większe pliki wykonywalne niż __stdcall, ponieważ wymaga, aby każde wywołanie funkcji obejmowało kod porządkujący stosu.Na poniższej liście przedstawiono implementację niniejszej konwencji wywoływania.

Element

Implementacja

Kolejność przekazywania argumentów

Od prawej do lewej.

Odpowiedzialność za utrzymanie stosu

Funkcja wywołująca pobiera argumenty ze stosu.

Konwencja dekorowania nazw

Znak podkreślnika (_) jest umieszczany przez nazwami, z wyjątkiem sytuacji, gdy eksportowane są funkcje __cdecl, które używają połączenia C.

Konwencja translacji wielkości liter

Translacja wielkości liter nie jest wykonywana.

[!UWAGA]

Aby uzyskać powiązane informacje, zobacz Nazwy ozdobione.

Umieść modyfikator __cdecl przed zmienną lub nazwą funkcji.Ponieważ nazewnictwo C i konwencje wywoływania są domyślne, należy użyć __cdecl w kodzie x86 tylko wtedy, gdy określasz opcję kompilatora /Gv (vectorcall), /Gz (stdcall) lub /Gr (fastcall).Opcja kompilatora /Gd wymusza konwencję wywoływania __cdecl.

Na procesorach ARM i x64 konwencja __cdecl jest akceptowana, ale zazwyczaj kompilator ją ignoruje.Przez konwencję na ARM i x64, argumenty są przekazywane w rejestrach, jeżeli jest to możliwe, a pozostałe argumenty są przekazywane na stosie.W kodzie x64, użyj __cdecl, aby zastąpić opcję kompilatora /Gv i wykorzystać domyślną konwencję wywoływania x64.

W przypadku funkcji niestatycznych klas, jeśli funkcja jest zdefiniowana poza wierszem, modyfikator konwencji wywoływania nie musi być określony w definicji poza wierszem.Oznacza to, że dla metod niestatycznego elementu członkowskiego klasy przyjmowana jest konwencja wywoływania określona podczas deklaracji w punkcie definicji.Biorąc pod uwagę tę definicję klasy:

struct CMyClass {
   void __cdecl mymethod();
};

to:

void CMyClass::mymethod() { return; }

jest równoważne temu:

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

Przykład

W poniższym przykładzie kompilator jest poinstruowany, aby używać konwencji nazewnictwa i konwencji wywoływania języka C dla funkcji 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, ...);

Zobacz też

Informacje

Przekazywanie argumentów i konwencje nazewnictwa

Słowa kluczowe języka C++