具有位域的C风格结构如何在Rust#[repr(C)]结构中表示?

mar*_*hon 3 c struct rust bit-fields

我有一个C结构定义为:

struct my_c_s {
    u_char          *ptr;
    unsigned        flag_a:1;
    unsigned        flag_b:1;
    int             some_num;
}
Run Code Online (Sandbox Code Playgroud)

怎么会flag_aflag_b代表?

#[repr(C)]
pub struct my_rust_s {
    pub ptr: *const u_char,
    //pub flag_a: ?,
    //pub flag_b: ?,
    pub some_num: ::libc::c_int,
}
Run Code Online (Sandbox Code Playgroud)

我可以将它们声明为bools吗? 或者整个事情需要是一个具有单个字段的位集合,然后我将它们用位掩码?

例如 pub flag_bits: ::libc::c_uint,

Mas*_*ara 8

不,你不能.

一个关于支持位域的公开问题,似乎没有激活.在这个问题中,@ retep998解释了如何处理位域winapi.如果您需要处理C接口中的位域,这可能会有所帮助.

OP似乎旨在实现C互操作,但如果您只需要位域功能,则有几种解决方案.

  • 您应该始终考虑简单的冗余解决方案:避免使用位域并让字段自然对齐.
  • bitfield,根据评论 - 我不知道,但似乎提供C位域等效.
  • bitflags.这似乎适用于基于位的标志,通常enum用C 表示.
  • #[repr(packed)]如果你只想在某种程度上打包字段,忽略对齐.字段仍将与字节边界对齐.
  • bit-vec 如果你需要同质的比特数组.

  • 您可以添加一些链接到可以处理它的板条箱. (3认同)