__cdecl
__cdecl
adalah konvensi panggilan default untuk program C dan C++. Karena tumpukan dibersihkan oleh pemanggil, tumpukan dapat melakukan vararg
fungsi. Konvensi __cdecl
panggilan membuat executable yang lebih besar dari __stdcall, karena memerlukan setiap panggilan fungsi untuk menyertakan kode pembersihan tumpukan. Daftar berikut menunjukkan implementasi konvensi panggilan ini. Pengubah __cdecl
khusus Microsoft.
Elemen | implementasi |
---|---|
Urutan pengoperasian argumen | Kanan ke kiri. |
Tanggung jawab pemeliharaan tumpukan | Fungsi panggilan memunculkan argumen dari tumpukan. |
Konvensi dekorasi nama | Karakter garis bawah (_) diawali ke nama, kecuali ketika __cdecl fungsi yang menggunakan tautan C diekspor. |
Konvensi terjemahan kasus | Tidak ada terjemahan kasus yang dilakukan. |
Catatan
Untuk informasi terkait, lihat Nama yang Didekorasi.
Tempatkan pengubah __cdecl
sebelum variabel atau nama fungsi. Karena konvensi penamaan dan panggilan C adalah default, satu-satunya waktu yang harus Anda gunakan __cdecl
dalam kode x86 adalah ketika Anda telah menentukan /Gv
opsi pengkompilasi (vektorcall), /Gz
(stdcall), atau /Gr
(fastcall). Opsi kompilator /Gd memaksa __cdecl
konvensi panggilan.
Pada prosesor ARM dan x64, __cdecl
diterima tetapi biasanya diabaikan oleh pengkompilasi. Menurut konvensi pada ARM dan x64, argumen diteruskan dalam register jika memungkinkan, dan argumen berikutnya diteruskan pada tumpukan. Dalam kode x64, gunakan __cdecl
untuk mengambil alih opsi pengkompilasi /Gv dan gunakan konvensi panggilan x64 default.
Untuk fungsi kelas non-statis, jika fungsi didefinisikan di luar baris, pengubah konvensi panggilan tidak harus ditentukan pada definisi di luar baris. Artinya, untuk metode anggota non-statis kelas, konvensi panggilan yang ditentukan selama deklarasi diasumsikan pada titik definisi. Mengingat definisi kelas ini:
struct CMyClass {
void __cdecl mymethod();
};
ini:
void CMyClass::mymethod() { return; }
setara dengan ini:
void __cdecl CMyClass::mymethod() { return; }
Untuk kompatibilitas dengan versi sebelumnya, cdecl dan _cdecl adalah sinonim kecuali __cdecl
opsi pengompilasi /Za (Nonaktifkan ekstensi bahasa) ditentukan.
Contoh
Dalam contoh berikut, pengkompilasi diinstruksikan untuk menggunakan konvensi penamaan dan panggilan C untuk fungsi tersebut 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, ...);