Sebab mengapa C# cdecl
dan C __stdcall
wujud bersama dalam P/Invoke
Dalam interop P/Invoke antara C# dan C, ia sering berlaku bahawa fungsi C# menggunakan konvensyen panggilan cdecl
, manakala rakan sejawatannya C menggunakan tandatangan __stdcall
. Ketidakpadanan ini berpunca daripada panggilan pilihan konvensyen yang secara sejarah berterusan hingga ke hari ini.
__stdcall
: Pembersihan pemanggil fungsi Windows
__stdcall
Mewarisi daripada konvensyen panggilan Pascal 16-bit dan merupakan konvensyen panggilan lalai untuk fungsi Windows API dan COM. Ia menyediakan untuk penerima (fungsi yang dipanggil) untuk membersihkan tindanan selepas pelaksanaan, menjadikannya lebih padat dalam persekitaran yang terhad sumber. Walau bagaimanapun, kelebihan ini datang dengan risiko ketidakseimbangan tindanan jika bilangan hujah yang dijangkakan oleh pemanggil dan penerima tidak sepadan.
__cdecl
: Pembersihan fungsi variadik pemanggil
__cdecl
ialah konvensyen panggilan standard dalam C untuk fungsi dengan bilangan argumen yang berubah-ubah, seperti printf()
dan scanf()
. Konvensyen ini meletakkan tanggungjawab untuk pembersihan tindanan pada pemanggil, kerana pemanggil mengetahui bilangan hujah yang diluluskan. Terlupa untuk menyatakan [DllImport]
dalam perisytiharan CallingConvention.Cdecl
dalam C# ialah perangkap biasa.
__thiscall
: Sembunyikan penunjuk kaedah C ini
__thiscall
merujuk secara khusus kepada C dan digunakan untuk mengendalikan menghantar petunjuk this
tersembunyi dalam kaedah contoh kelas. Ia serupa dengan __cdecl
, tetapi .NET P/Invoke marshaler tidak menyokongnya, jadi ia tidak sesuai digunakan dengan kod pinvoke C.
Ringkasan
Kewujudan bersama panggilan dalam C# dan cdecl
tandatangan dalam C adalah hasil daripada konvensyen panggilan bersejarah ini dan keperluan khusus setiap bahasa. Pemahaman yang betul tentang konvensyen ini, serta atribut __stdcall
dan [DllImport]
EntryPoint
, adalah penting untuk memastikan kefungsian P/Invoke yang betul dan mengelakkan kemungkinan masalah seperti ketidakseimbangan tindanan. ExactSpelling
Atas ialah kandungan terperinci Kenapa panggilan C. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!