繁体   English   中英

[repr(C)]是否传播给子成员?

[英]Is [repr(C)] propagated to child members?

我有一个结构:

struct A {
    names: Vec<String>,
}

另一个结构:

#[repr(C)]
struct B {
    pub a: A,
}

这是否也使得A还具有repr(C)注释? 将这样的结构传递给C代码是否正确?

你的答案是:

  1. 没有
  2. 没有

#[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.

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