CodeBlanks Logo Icon CodeBlanks

FFI çağrısı

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

main.rs
fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
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

Soru
unsafe extern "____" {
    fn abs(x: i32) -> i32;
}
Cevap
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

İleri seviye bölümündeki tüm dersler