簡體   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