Bagikan melalui


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

Baca juga

Konvensi Passing dan Penamaan Argumen
Kata kunci