extern bloğu
- Rust kursu
- İleri seviye
- Ders 36/81
- 4 dk
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
use std::ffi::c_int;
fn main() {
// buraya yaz
}Örnek çözüm
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ı
unsafe extern "C" {
fn toupper(c: ____) -> c_int;
}
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 |