__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, ...);