Rust与C交互的5大核心技巧。

Rust与C接口交互的核心方法

Rust与C的交互主要通过extern关键字和#[no_mangle]属性实现。extern块用于定义或声明外部函数接口(FFI),而#[no_mangle]确保函数名在编译后不被混淆,便于C代码调用。

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

对应的C头文件声明:

int rust_add(int a, int b);

数据类型的兼容性处理

基础类型如i32f64等可直接映射到C的intdouble。复合类型需使用#[repr(C)]强制内存布局与C兼容:

#[repr(C)]
pub struct Point {
    x: i32,
    y: i32,
}

C端对应结构体:

typedef struct {
    int x;
    int y;
} Point;

所有权与生命周期的管理

Rust到C传递指针时需明确所有权。使用Box::into_raw转换所有权到C端,返回时用Box::from_raw回收:

#[no_mangle]
pub extern "C" fn create_point(x: i32, y: i32) -> *mut Point {
    Box::into_raw(Box::new(Point { x, y }))
}

#[no_mangle]
pub extern "C" fn free_point(p: *mut Point) {
    unsafe { Box::from_raw(p) };
}

错误处理机制

通过返回错误码和输出参数传递错误信息:

#[repr(C)]
pub enum ErrorCode {
    Ok,
    InvalidInput,
}

#[no_mangle]
pub extern "C" fn parse_input(input: *const c_char, output: *mut i32) -> ErrorCode {
    unsafe {
        if input.is_null() {
            return ErrorCode::InvalidInput;
       
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值