Ngôn ngữ lập trình Rust cho phép nhúng mã nguồn của ngôn ngữ lập trình C vào để biên dịch thành mã máy, cụ thể là thành file nhị phân để chạy.
Rust cho phép xài mã nguồn C trong nó bằng khai báo extern C.
Lấy ví dụ là các ông lập trình Rust đã viết lại coreutils bằng Rust thay cho C.
Trong mã nguồn của Rust có đoạn unsafe extern C như này:
/// This function is unsafe because it calls a C API
#[unsafe(no_mangle)]
pub unsafe extern "C" fn __stdbuf_get_stdin() -> *mut FILE {
#[cfg(any(target_os = "macos", target_os = "freebsd"))]
{
unsafe extern "C" {
fn __stdinp() -> *mut FILE;
}
unsafe { __stdinp() }
}
#[cfg(not(any(target_os = "macos", target_os = "freebsd")))]
{
unsafe extern "C" {
static mut stdin: *mut FILE;
}
unsafe { stdin }
}
}
https://github.com/uutils/coreutils/blob/main/src/uu/stdbuf/src/libstdbuf/src/libstdbuf.rs
Câu hỏi dành cho các bạn thích lập trình Rust là tại sao phải nhúng mã nguồn C vào Rust trong trường hợp này.
Mời bạn coi video lập trình Rust của tôi để hiểu rõ hơn khi biên dịch Rust có nhúng mã nguồn C sẽ cần phải làm gì.