Foreign Function Interface
Rust cung cấp một Foreign Function Interface (FFI) tới các thư viện C. Các
hàm ngoại lai phải được khai báo trong một khối extern
được ghi chú với một
thuộc tính #[link]
chứa tên của thư viện bên ngoài.
use std::fmt;
// khối extern này liên kết tới thư viện libm
#[link(name = "m")]
extern {
// đây là một hàm ngoại lai tính căn bậc hai của một số phức
fn csqrtf(z: Complex) -> Complex;
fn ccosf(z: Complex) -> Complex;
}
// Khi việc gọi một hàm ngoại lai được coi là không an toàn,
// các wrapper sẽ được sử dụng để bọc các hàm đó.
fn cos(z: Complex) -> Complex {
unsafe { ccosf(z) }
}
fn main() {
// z = -1 + 0i
let z = Complex { re: -1., im: 0. };
// gọi một hàm ngoại lai là hành động không an toàn
let z_sqrt = unsafe { csqrtf(z) };
println!("the square root of {:?} is {:?}", z, z_sqrt);
// gọi một API an toàn bọc xung quanh một hành động không an toàn
println!("cos({:?}) = {:?}", z, cos(z));
}
// Một thiết lập tối thiểu của số phức
#[repr(C)]
#[derive(Clone, Copy)]
struct Complex {
re: f32,
im: f32,
}
impl fmt::Debug for Complex {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
if self.im < 0. {
write!(f, "{}-{}i", self.re, -self.im)
} else {
write!(f, "{}+{}i", self.re, self.im)
}
}
}