__cdecl

__cdecl to domyślna konwencja wywoływania programów C i C++. Ponieważ stos jest czyszczony przez obiekt wywołujący, może wykonywać vararg funkcje. Konwencja __cdecl wywoływania tworzy większe pliki wykonywalne niż __stdcall, ponieważ wymaga wywołania każdej funkcji w celu uwzględnienia kodu oczyszczania stosu. Na poniższej liście przedstawiono implementację niniejszej konwencji wywoływania. Modyfikator __cdecl jest specyficzny dla firmy Microsoft.

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ślenia (_) jest poprzedzony nazwami, z wyjątkiem sytuacji, gdy funkcje __cdecl używające linku języka C są eksportowane.
Konwencja translacji wielkości liter Translacja wielkości liter nie jest wykonywana.

Uwaga

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

__cdecl Umieść modyfikator przed zmienną lub nazwą funkcji. Ponieważ konwencje nazewnictwa i wywoływania języka C są domyślne, jedynym czasem, którego należy użyć __cdecl w kodzie x86, jest określenie opcji kompilatora /Gv (vectorcall), /Gz (stdcall) lub /Gr (fastcall). /Gd opcji kompilatora wymusza konwencję __cdecl wywoływania.

W procesorach ARM i x64 jest akceptowany, __cdecl ale zazwyczaj ignorowany przez kompilator. 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 polecenia __cdecl , aby zastąpić opcję /Gv kompilatora i użyć domyślnej konwencji 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 niestatycznej składowej 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; }

Aby uzyskać zgodność z poprzednimi wersjami, cdecl i _cdecl są synonimem, __cdecl chyba że określono opcję kompilatora /Za (Wyłącz rozszerzenia języka).

Przykład

W poniższym przykładzie kompilator jest poinstruowany o użyciu konwencji nazewnictwa i wywoływania języka C dla system funkcji.

// 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ż

Przekazywanie argumentów i konwencje nazewnictwa
Słowa kluczowe