我有一個結構:[repr(C)]是否傳播給子成員?
struct A {
names: Vec<String>,
}
而另一個結構:
#[repr(C)]
struct B {
pub a: A,
}
這是否讓A
也有repr(C)
註解?將這樣的結構傳遞給C代碼是否正確?
我有一個結構:[repr(C)]是否傳播給子成員?
struct A {
names: Vec<String>,
}
而另一個結構:
#[repr(C)]
struct B {
pub a: A,
}
這是否讓A
也有repr(C)
註解?將這樣的結構傳遞給C代碼是否正確?
你的答案是:
#[repr(C)]
不作結構「安全FFI」,它保證了內存中表示將原樣和編譯器不會嘗試在封面下優化它們的空間/效率。這是偶然的,安全FFI也是需要的。
將結構傳遞給C代碼當然不安全。還有一些注意事項在documentation,包括:
DSTS,元組和標籤聯合是不是在C概念,因此從來都不FFI安全
你有沒有保證有關無論這些是否在Vec
。另外,由於Vec
是不透明的。
如果類型會有任何下降的標誌,他們仍然會被添加」
再次,Vec
可能有一些。
在任何情況下,爲它在接收的C代碼中有任何意義,您還需要在C中聲明您的結構;並且由於Vec<String>
是不透明的,因此沒有合理的方法來執行此操作。我認爲擁有#[repr(C)]
的原因是重現數據以匹配您想與之互操作的現有C API;不以某種方式直接暴露內部的鏽類型爲C.