__stdcall
Konvensi __stdcall
panggilan digunakan untuk memanggil fungsi API Win32. Penerima panggilan membersihkan tumpukan, sehingga pengkompilasi membuat vararg
fungsi __cdecl
. Fungsi yang menggunakan konvensi panggilan ini memerlukan prototipe fungsi. Pengubah __stdcall
khusus Microsoft.
Sintaks
return-type
__stdcall
function-name[(
argument-list)
]
Keterangan
Daftar berikut menunjukkan implementasi konvensi panggilan ini.
Elemen | implementasi |
---|---|
Urutan pengoperasian argumen | Kanan ke kiri. |
Konvensi pengoperasian argumen | Menurut nilai, kecuali penunjuk atau jenis referensi diteruskan. |
Tanggung jawab pemeliharaan tumpukan | Fungsi yang disebut memunculkan argumennya sendiri dari tumpukan. |
Konvensi dekorasi nama | Garis bawah (_ ) diawali dengan nama. Nama diikuti dengan tanda saat (@ ) diikuti dengan jumlah byte (dalam desimal) dalam daftar argumen. Oleh karena itu, fungsi yang dinyatakan sebagai int func( int a, double b ) dihiasi sebagai berikut: _func@12 |
Konvensi terjemahan kasus | Tidak ada |
Opsi pengkompilasi /Gz menentukan __stdcall
untuk semua fungsi yang tidak dideklarasikan secara eksplisit dengan konvensi panggilan yang berbeda.
Untuk kompatibilitas dengan versi sebelumnya, _stdcall
adalah sinonim kecuali __stdcall
opsi /Za
pengompilasi (Nonaktifkan ekstensi bahasa) ditentukan.
Fungsi yang dinyatakan menggunakan pengubah __stdcall
mengembalikan nilai dengan cara yang sama seperti fungsi yang dideklarasikan menggunakan __cdecl
.
Pada prosesor ARM dan x64, __stdcall
diterima dan diabaikan oleh kompilator; pada arsitektur ARM dan x64, berdasarkan konvensi, argumen diteruskan dalam register jika memungkinkan, dan argumen berikutnya diteruskan pada tumpukan.
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 __stdcall mymethod();
};
ini
void CMyClass::mymethod() { return; }
setara dengan ini
void __stdcall CMyClass::mymethod() { return; }
Contoh
Dalam contoh berikut, penggunaan __stdcall
hasil di semua WINAPI
jenis fungsi yang ditangani sebagai panggilan standar:
// Example of the __stdcall keyword
#define WINAPI __stdcall
// Example of the __stdcall keyword on function pointer
typedef BOOL (__stdcall *funcname_ptr)(void * arg1, const char * arg2, DWORD flags, ...);
Baca juga
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk