我有一个结构:
struct A {
names: Vec<String>,
}
另一个结构:
#[repr(C)]
struct B {
pub a: A,
}
这会使A
也有repr(C)
注释吗?将这样的结构传递给C代码是否正确?
答案 0 :(得分:3)
你的答案是:
#[repr(C)]
不会使结构“对FFI安全”,它保证内存中的表示将保持原样,并且编译器不会尝试在封面下优化空间/效率。这无疑是安全FFI所需要的。
答案 1 :(得分:2)
将结构传递给C代码当然不安全。 documentation中有一些注意事项,包括:
DST,元组和标记的联合不是C中的概念,因此从不FFI安全
您无法保证Vec
中是否有任何这些内容。此外,由于Vec
不透明。
如果类型有任何丢弃标记,它们仍将被添加“
同样,Vec
可能有一些。
在任何情况下,为了使它在接收C代码中有任何意义,你需要在C中声明你的结构;由于Vec<String>
是不透明的,因此没有合理的方法。
我认为拥有#[repr(C)]
的原因是重现数据以匹配您想要与之互操作的现有C API;不要以某种方式直接将内部Rust类型公开给C。