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

时间:2016-07-13 12:36:02

标签: rust

我有一个结构:

struct A {
    names: Vec<String>,
}

另一个结构:

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

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

2 个答案:

答案 0 :(得分:3)

你的答案是:

  1. 没有
  2. 没有
  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。