Bagikan melalui


/Gd, /Gr, /Gv, /Gz (Konvensi Panggilan)

Opsi ini menentukan urutan di mana argumen fungsi didorong ke tumpukan, apakah fungsi pemanggil atau fungsi yang disebut menghapus argumen dari tumpukan di akhir panggilan, dan konvensi dekorasi nama yang digunakan pengkompilasi untuk mengidentifikasi fungsi individual.

Sintaks

/Gd
/Gr
/Gv
/Gz

Keterangan

/Gd, pengaturan default, menentukan konvensi panggilan __cdecl untuk semua fungsi kecuali fungsi dan fungsi anggota C++ yang ditandai __stdcall, __fastcall, atau __vectorcall.

/Gr__fastcall menentukan konvensi panggilan untuk semua fungsi kecuali fungsi anggota C++, fungsi bernama main, dan fungsi yang ditandai __cdecl, , __stdcallatau __vectorcall. Semua __fastcall fungsi harus memiliki prototipe. Konvensi panggilan ini hanya tersedia di pengkompilasi yang menargetkan x86, dan diabaikan oleh pengkompilasi yang menargetkan arsitektur lain.

/Gz__stdcall menentukan konvensi panggilan untuk semua fungsi kecuali fungsi anggota C++, fungsi bernama main, dan fungsi yang ditandai __cdecl, , __fastcallatau __vectorcall. Semua __stdcall fungsi harus memiliki prototipe. Konvensi panggilan ini hanya tersedia di pengkompilasi yang menargetkan x86, dan diabaikan oleh pengkompilasi yang menargetkan arsitektur lain.

/Gv__vectorcall menentukan konvensi panggilan untuk semua fungsi kecuali fungsi anggota C++, fungsi bernama main, fungsi dengan vararg daftar argumen variabel, atau fungsi yang ditandai dengan atribut , , __stdcallatau __fastcall yang bertentangan__cdecl. Konvensi panggilan ini hanya tersedia pada arsitektur x86 dan x64 yang mendukung /arch:SSE2 ke atas, dan diabaikan oleh kompilator yang menargetkan arsitektur ARM.

Fungsi yang mengambil jumlah variabel argumen harus ditandai __cdecl.

/Gd, /Gr, /Gv dan /Gz tidak kompatibel dengan /clr:safe atau /clr:pure. Opsi kompilator /clr:pure dan /clr:safe tidak digunakan lagi di Visual Studio 2015 dan tidak didukung di Visual Studio 2017 dan yang lebih baru.

Catatan

Secara default untuk prosesor x86, fungsi anggota C++ menggunakan __thiscall.

Untuk semua prosesor, fungsi anggota yang secara eksplisit ditandai sebagai __cdecl, , __fastcall__vectorcall, atau __stdcall menggunakan konvensi panggilan yang ditentukan jika tidak diabaikan pada arsitektur tersebut. Fungsi anggota yang mengambil jumlah variabel argumen selalu menggunakan __cdecl konvensi panggilan.

Opsi kompilator ini tidak berpengaruh pada dekorasi nama metode dan fungsi C++. Kecuali dinyatakan sebagai extern "C"metode dan fungsi C++ menggunakan skema dekorasi nama yang berbeda. Untuk informasi selengkapnya, lihat Nama yang Didekorasi.

Untuk informasi selengkapnya tentang konvensi panggilan, lihat Konvensi Panggilan.

Spesifikasi __cdecl

Pada prosesor x86, semua argumen fungsi diteruskan pada tumpukan dari kanan ke kiri. Pada arsitektur ARM dan x64, beberapa argumen diteruskan oleh register dan sisanya diteruskan pada tumpukan dari kanan ke kiri. Rutinitas panggilan memunculkan argumen dari tumpukan.

Untuk C, __cdecl konvensi penamaan menggunakan nama fungsi yang didahului oleh garis bawah ( _ ); tidak ada terjemahan kasus yang dilakukan. Kecuali dinyatakan sebagai extern "C", fungsi C++ menggunakan skema dekorasi nama yang berbeda. Untuk informasi selengkapnya, lihat Nama yang Didekorasi.

Spesifikasi __fastcall

__fastcall Beberapa argumen fungsi diteruskan dalam register (untuk prosesor x86, ECX, dan EDX), dan sisanya didorong ke tumpukan dari kanan ke kiri. Rutinitas yang disebut memunculkan argumen ini dari tumpukan sebelum kembali. Biasanya, /Gr mengurangi waktu eksekusi.

Catatan

Berhati-hatilah saat Anda menggunakan __fastcall konvensi panggilan untuk fungsi apa pun yang ditulis dalam bahasa assembly sebaris. Penggunaan register Anda dapat bertentangan dengan penggunaan kompilator.

Untuk C, __fastcall konvensi penamaan menggunakan nama fungsi yang didahului oleh tanda (@) diikuti dengan ukuran argumen fungsi dalam byte. Tidak ada terjemahan kasus yang dilakukan. Pengkompilasi menggunakan templat ini untuk konvensi penamaan:

@function_name@number

Saat Anda menggunakan __fastcall konvensi penamaan, gunakan file include standar. Jika tidak, Anda akan mendapatkan referensi eksternal yang belum terselesaikan.

Spesifikasi __stdcall

Argumen __stdcall fungsi didorong ke tumpukan dari kanan ke kiri, dan fungsi yang disebut memunculkan argumen ini dari tumpukan sebelum kembali.

Untuk C, __stdcall konvensi penamaan menggunakan nama fungsi yang didahului oleh garis bawah (_) dan diikuti oleh tanda saat (@) dan ukuran argumen fungsi dalam byte. Tidak ada terjemahan kasus yang dilakukan. Pengkompilasi menggunakan templat ini untuk konvensi penamaan:

_functionname@number

Spesifikasi __vectorcall

__vectorcall Argumen bilangan bulat fungsi diteruskan oleh nilai, menggunakan hingga dua (pada x86) atau empat (pada x64) register bilangan bulat, dan hingga enam register XMM untuk nilai floating-point dan vektor, dan sisanya diteruskan pada tumpukan dari kanan ke kiri. Fungsi yang disebut membersihkan tumpukan sebelum kembali. Nilai pengembalian vektor dan floating-point dikembalikan dalam XMM0.

Untuk C, __vectorcall konvensi penamaan menggunakan nama fungsi diikuti oleh dua tanda (@@) dan ukuran argumen fungsi dalam byte. Tidak ada terjemahan kasus yang dilakukan. Pengkompilasi menggunakan templat ini untuk konvensi penamaan:

functionname@@number

Untuk mengatur opsi pengkompilasi ini di lingkungan pengembangan Visual Studio

  1. Buka kotak dialog Halaman Properti proyek. Untuk detailnya, lihat Mengatur pengkompilasi C++ dan membuat properti di Visual Studio.

  2. Pilih halaman properti Properti>Konfigurasi C/C++>Tingkat Lanjut.

  3. Ubah properti Konvensi Panggilan.

Untuk mengatur opsi pengkompilasi ini secara terprogram

Baca juga