__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