[英]Is [repr(C)] propagated to child members?
我有一个结构:
struct A {
names: Vec<String>,
}
另一个结构:
#[repr(C)]
struct B {
pub a: A,
}
这是否也使得A
还具有repr(C)
注释? 将这样的结构传递给C代码是否正确?
你的答案是:
#[repr(C)]
不会使结构“对FFI安全”,它保证了内存中的表示将保持原样,并且编译器不会尝试在封面下优化空间/效率。 这无疑是安全FFI所需要的。
将结构传递给C代码当然是不安全的。 文档中有一些警告,包括:
DST,元组和标记的联合不是C中的概念,因此从不FFI安全
您无法保证这些是否属于Vec
。 此外,由于Vec
是不透明的。
如果类型有任何丢弃标志,它们仍将被添加“
再次, Vec
可能有一些。
在任何情况下,为了使它在接收C代码中有任何意义,你需要在C中声明你的结构; 由于Vec<String>
是不透明的,因此没有合理的方法。
我认为#[repr(C)]
是重现数据以匹配您想要与之互操作的现有C API; 不要以某种方式直接将内部Rust类型暴露给C.
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.