Как вызвать метод структуры Rust из C, используя FFI? - PullRequest
0 голосов
/ 12 января 2019

Я пытаюсь вызвать публичную функцию (расположенную внутри блока impl структуры Rust) из C-программы, используя FFI. Вызов регулярных pub fn не доставил особых хлопот, но я пытаюсь вызвать pub fn из struct блока *1003* и не могу найти правильный синтаксис для его выставления / вызова. Конечно, это возможно, верно?

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;
}

1 Ответ

0 голосов
/ 13 января 2019

Нет, это невозможно. Вам нужно будет написать функции shim для каждого метода, к которому вы хотите получить доступ:

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

Смотри также:

...