首页 > 解决方案 > type OnProduce = extern "C" fn 不是 FFI 安全的

问题描述

pub type OnProduce = extern "C" fn(*mut ZLMedia, *const u8, size_t);
extern "C" {
    pub fn zlmedia_set_on_produce(zl_media: *mut ZLInstance, on_produce: OnProduce);
}

我得到:

   |
23 |     pub fn zlmedia_set_on_produce(zl_media: *mut ZLInstance, on_produce: OnProduce);
   |                                                                          ^^^^^^^^^ not FFI-safe
   |
   = help: consider adding a `#[repr(C)]` or `#[repr(transparent)]` attribute to this struct
   = note: this struct has unspecified layout

但不能#[repr(C)]为类型添加,只能为结构添加。如您所见,OnProduce是一个extern "C"函数。我以为它已经是 FFI 安全的了

标签: rust

解决方案


正如@Frxstream 指出的那样,这可能是因为ZLMedia它不是 FFI 安全的。

引用:

问题在于,在 Rust 中,当结构为 repr(Rust)(默认)时,它可以自由使用它认为对您的程序最有效的任何布局。因此,这可能(假设地)在两个 Rust 程序之间是不同的,如果这两个程序是使用不同版本的 Rust 编译器编译的,则更有可能是不同的。

因此,对于 FFI,您需要明确指定的布局。目前,C 和透明是结构的唯一稳定布局。未来可能会有更多,但目前还有很长的路要走。

我最近在论坛上对此进行了讨论,您可能有兴趣阅读(引用来源):[链接]


推荐阅读