CodeBlanks Logo Icon CodeBlanks

extern bloğu

extern "C" ile C fonksiyonlarını tanımlarsın.

extern bloğu

C kütüphanelerindeki fonksiyonlar bir extern "C" bloğunda bildirilir. C türleri için std::ffi ve std::os::raw takma adlarını kullan: C'nin int'i her platformda Rust'ın i32'si olmayabilir:

use std::ffi::c_int;

unsafe extern "C" {
    fn toupper(c: c_int) -> c_int;
}

let buyuk = unsafe { toupper('a' as c_int) } as u8 as char;   // 'A'

Standart C kütüphanesi (libc) zaten bağlıdır. Başka bir kütüphane için #[link(name = "z")] özniteliği ya da bir build.rs betiği kullanılır.

Bağlama

Bildirim yalnızca imzayı verir; fonksiyonun gövdesi bağlama (link) aşamasında bulunur. Bulunamazsa hata derlemede değil, bağlayıcıda çıkar: "undefined reference to ...". Statik ve dinamik bağlama seçilebilir:

#[link(name = "sqlite3")]              // libsqlite3.so / sqlite3.lib
unsafe extern "C" {
    fn sqlite3_libversion() -> *const std::ffi::c_char;
}

Hazır bağlamalar için -sys uzantılı crate'ler (örneğin libsqlite3-sys) kullanılır; üstlerine güvenli sarmalayıcı crate'ler kurulur.

Uygulama toupper çağrısı

unsafe extern "C" bloğunda C'nin toupper fonksiyonunu bildir. 'a' ve 'z' karakterlerini büyüt ve sonuçları char olarak boşlukla yazdır.

Başlangıç kodu

main.rs
use std::ffi::c_int;

fn main() {
    // buraya yaz
}

Örnek çözüm

main.rs
use std::ffi::c_int;

unsafe extern "C" {
    fn toupper(c: c_int) -> c_int;
}

fn buyut(c: char) -> char {
    // SAFETY: toupper her ASCII değeri için tanımlıdır.
    (unsafe { toupper(c as c_int) }) as u8 as char
}

fn main() {
    println!("{} {}", buyut('a'), buyut('z'));
}

Beklenen çıktı

A Z

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 C'nin <code>long</code> türü için hangi Rust türü kullanılmalı?

  • isize
  • std::ffi::c_long Doğru cevap
  • i64 her zaman
  • i32 her zaman

Açıklama: long, 64 bit Linux'ta 64, Windows'ta 32 bittir; c_long platforma göre doğru türü seçer.

2 C tamsayısı

Soru
unsafe extern "C" {
    fn toupper(c: ____) -> c_int;
}
Cevap
unsafe extern "C" {
    fn toupper(c: c_int) -> c_int;
}

Açıklama: C'nin int türü Rust'ta std::ffi::c_int ile ifade edilir.

3 C türü ve Rust karşılığı

Kavram Anlamı
int c_int
long c_long
char * *const c_char
void * *mut c_void

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