Bagikan melalui


__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__stdcallfunction-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

Konvensi Passing dan Penamaan Argumen
Kata kunci