Rumah > pembangunan bahagian belakang > C++ > Kenapa panggilan C

Kenapa panggilan C

Mary-Kate Olsen
Lepaskan: 2025-01-25 23:41:10
asal
348 orang telah melayarinya

Why Do C# `Cdecl` Calls and C   `__stdcall` Signatures Coexist in P/Invoke?

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan