FFI çağrısı
- Rust kursu
- İleri seviye
- Ders 34/81
- 4 dk
extern "C" ile dış fonksiyon çağırmayı öğrenirsin.
FFI çağrısı
Yabancı fonksiyon arayüzü (FFI), başka dillerde (çoğunlukla C) yazılmış fonksiyonları çağırmayı sağlar. Fonksiyonlar bir extern "C" bloğunda bildirilir. Derleyici bu fonksiyonların imzasını doğrulayamadığı için çağrı unsafe'tir; Rust 1.82'den beri bloğun kendisi de unsafe extern olarak işaretlenir:
unsafe extern "C" {
fn abs(x: i32) -> i32; // C standart kütüphanesinden
}
let n = unsafe { abs(-7) }; // 7"C", çağrı kuralını (ABI) belirtir: argümanların nasıl geçirileceği ve sonucun nasıl döneceği.
Güvenli sarmalayıcı
FFI çağrılarını küçük güvenli fonksiyonlarla sarmak, unsafe'i tek bir yerde toplar:
fn mutlak(x: i32) -> i32 {
// SAFETY: abs her i32 için tanımlıdır; i32::MIN dışında taşma yok.
unsafe { abs(x) }
}Ters yön de mümkündür: #[no_mangle] pub extern "C" fn ile Rust fonksiyonları C'den çağrılabilir hale gelir. Bir sonraki grupta FFI'ı ayrıntılı göreceğiz.
Uygulama C'den abs
unsafe extern "C" bloğunda fn abs(x: i32) -> i32; bildir ve onu saran güvenli fn mutlak(x: i32) -> i32 yaz. mutlak(-7) ve mutlak(3) sonuçlarını boşlukla yazdır.
Başlangıç kodu
fn main() {
// buraya yaz
}Örnek çözüm
unsafe extern "C" {
fn abs(x: i32) -> i32;
}
fn mutlak(x: i32) -> i32 {
// SAFETY: abs her i32 için tanımlıdır.
unsafe { abs(x) }
}
fn main() {
println!("{} {}", mutlak(-7), mutlak(3));
}Beklenen çıktı
7 3
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Bildirilen imza C'deki gerçek imzayla uyuşmazsa ne olur?
- Derleme hatası
- Bağlayıcı hatası her zaman
- Otomatik düzeltilir
- Tanımsız davranış; derleyici bunu yakalayamaz Doğru cevap
Açıklama: Bu yüzden bildirimler genellikle bindgen gibi araçlarla C başlık dosyalarından üretilir.
2 Yabancı blok
unsafe extern "____" {
fn abs(x: i32) -> i32;
}
unsafe extern "C" {
fn abs(x: i32) -> i32;
}
Açıklama: "C" çağrı kuralı, C fonksiyonlarıyla uyumlu ABI'dir.
3 Öğe ve anlamı
| Kavram | Anlamı |
|---|---|
extern "C" |
C çağrı kuralı |
unsafe { abs(-7) } |
FFI çağrısı |
#[no_mangle] |
Adı korur |
bindgen |
Başlıktan bildirim üretir |