繁体   English   中英

如何使用FFI从C调用Rust结构的方法?

[英]How to call a Rust struct's method from C using FFI?

我试图使用FFI从C程序调用公共函数(位于Rust结构的impl块内)。 调用常规pub fn s并没有太多麻烦,但我试图从structimpl块中调用pub fn ,而没有找到正确的语法来公开/调用它。 当然这是可能的,对吧?

lib.rs

#[repr(C)]
#[derive(Debug)]
pub struct MyStruct {
    var: i32,
}

#[no_mangle]
pub extern "C" fn new() -> MyStruct {
    MyStruct { var: 99 }
}

#[no_mangle]
impl MyStruct {
    #[no_mangle]
    pub extern "C" fn print_hellow(&self) {
        println!("{}", self.var);
    }
}

main.c中

typedef struct MyStruct
{
    int var;
} MyStruct;
extern MyStruct new (void);
extern void print_hellow(MyStruct);

int main()
{
    MyStruct instance1;
    MyStruct instance2 = new ();

    printf("Instance1 var:%d\n", instance1.var);
    /// successfully prints the uninitialized 'var'

    printf("Instance2 var:%d\n", instance2.var);
    /// successfully prints the initialized 'var'

    print_hellow(instance1);
    /// fails to link during compilation

    return 0;
}

不,这是不可能的。 您需要为要访问的每个方法编写填充函数:

#[no_mangle]
pub unsafe extern "C" fn my_struct_print_hellow(me: *const MyStruct) {
    let me = &*me;
    me.print_hellow();
}

也可以看看:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM