56·Unsafe Rust高级

FFI 与 C 互操作

FFI 与 C 互操作

学习目标

  1. 掌握 extern "C" 声明
  2. 调用 C 函数
  3. 暴露 Rust 函数给 C

核心概念

调用 C 函数

extern "C" {
    fn abs(input: i32) -> i32;
    fn sqrt(input: f64) -> f64;
}

fn main() {
    unsafe {
        println!("abs(-5) = {}", abs(-5));
        println!("sqrt(16) = {}", sqrt(16.0));
    }
}

暴露给 C

#[no_mangle]
pub extern "C" fn rust_add(a: i32, b: i32) -> i32 {
    a + b
}

// C 代码可以调用 rust_add(1, 2)

CString 和 CStr

use std::ffi::{CString, CStr};
use std::os::raw::c_char;

extern "C" {
    fn strlen(s: *const c_char) -> usize;
}

fn main() {
    let c_str = CString::new("Hello, C!").unwrap();
    unsafe {
        let len = strlen(c_str.as_ptr());
        println!("长度: {}", len);
    }
}

链接 C 库

# build.rs
fn main() {
    println!("cargo:rustc-link-lib=m");
}
extern "C" {
    fn pow(base: f64, exp: f64) -> f64;
}

fn main() {
    unsafe {
        println!("2^10 = {}", pow(2.0, 10.0));
    }
}

小结

语法用途
extern "C"声明外部 C 函数
#[no_mangle]保持函数名不改编
CStringRust → C 字符串
CStrC → Rust 字符串

练习编辑器

rust
Loading...