繁体   English   中英

type OnProduce = extern "C" fn 不是 FFI 安全的

[英]type OnProduce = extern "C" fn is not FFI safe

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 安全的

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

引用:

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

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

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

暂无
暂无

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

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